【发布时间】:2019-08-21 17:32:50
【问题描述】:
我有一个使用 Realm 的预生产 Swift 应用程序。它有一个名为Product 的类,主键设置为“upc”。我修改了类以添加一些额外的变量,然后尝试运行迁移。现在,当我尝试运行该应用程序时,出现以下错误:
Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=1 "Primary key property 'Product.upc' has duplicate values after migration."
我知道我不能有重复的键值,但不清楚如何在不将 upc 值修改为不可接受的新值的情况下解决这个问题。有没有其他方法可以迁移、重置或删除架构来解决这个问题?
我试图删除领域文件并重新开始,但我遗漏了一些东西,因为这只是在我重新启动后再次发生。
Product类:
@objc dynamic var upc: Int = 0
@objc dynamic var itemDescription: String = ""
@objc dynamic var originalQty: Int = 0
//@objc dynamic var totalOriginalCost: String
//@objc dynamic var totalOriginalRetail: String
//@objc dynamic var vendorStyle: String
@objc dynamic var color: String = ""
@objc dynamic var size: String = ""
//@objc dynamic var clientCost: String
//@objc dynamic var totalClientCost: String
//@objc dynamic var division: String
//@objc dynamic var departmentName: String
//@objc dynamic var vendorName: String
@objc dynamic var image: String = ""
@objc dynamic var imageSlot1: String = ""
@objc dynamic var imageSlot2: String = ""
@objc dynamic var imageSlot3: String = ""
@objc dynamic var imageSlot4: String = ""
@objc dynamic var imageSlot5: String = ""
@objc dynamic var imageSlot6: String = ""
@objc dynamic var imageSlot7: String = ""
@objc dynamic var imageSlot8: String = ""
@objc dynamic var imageSlot9: String = ""
@objc dynamic var imageSlot10: String = ""
@objc dynamic var imageSlot11: String = ""
@objc dynamic var imageSlot12: String = ""
@objc dynamic var imageSlot13: String = ""
@objc dynamic var imageSlot14: String = ""
@objc dynamic var imageSlot15: String = ""
@objc dynamic var price: Double = 0
@objc dynamic var shipping: Double = 0
@objc dynamic var brand: String = ""
@objc dynamic var style: String = ""
@objc dynamic var sleeveStyle: String = ""
@objc dynamic var sleeveLength: String = ""
override static func primaryKey() -> String? {
return "upc"
}
}
migration代码:
// bump the schema version to 1
schemaVersion: 1,
migrationBlock: { migration, oldSchemaVersion in
migration.enumerateObjects(ofType: Product.className()) { oldObject, newObject in
if (oldSchemaVersion < 1) {
}
}
})
Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=1 "Primary key property 'Product.upc' has duplicate values after migration."
更新:我尝试使用以下代码重置架构,但随后出现新错误:
var config = Realm.Configuration() config.deleteRealmIfMigrationNeeded = true
error: Fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=10 "Migration is required due to the following errors: - Property 'Product.upc' has been made required. - Property 'Product.itemDescription' has been made required. - Property 'Product.originalQty' has been made required. - Property 'Product.color' has been made required. - Property 'Product.size' has been made required. - Property 'Product.image' has been made required. - Property 'Product.imageSlot1' has been made required. - Property 'Product.imageSlot2' has been made required. - Property 'Product.imageSlot3' has been made required. - Property 'Product.imageSlot10' has been added. - Property 'Product.imageSlot5' has been added. - Property 'Product.imageSlot6' has been made required. - Property 'Product.imageSlot7' has been made required. - Property 'Product.imageSlot8' has been made required. - Property 'Product.imageSlot9' has been made required. - Property 'Product.imageSlot4' has been added. - Property 'Product.imageSlot11' has been made required. - Property 'Product.imageSlot12' has been made required. - Property 'Product.imageSlot13' has been made required. - Property 'Product.imageSlot14' has been made required. - Property 'Product.imageSlot15' has been made required. - Property 'Product.price' has been made required. - Property 'Product.shipping' has been made required. - Property 'Product.brand' has been made required. - Property 'Product.style' has been made required. - Property 'Product.sleeveStyle' has been made required. - Property 'Product.sleeveLength' has been made required.
【问题讨论】:
-
如果您要添加或删除对象属性,则无需在迁移块中枚举这些对象。它将自动检测这些更改并相应地更新架构。因此,如果您删除 所有 领域文件(超过 1 个),将架构重置为 0 并重新运行应用程序,您仍然会收到该错误吗?你确定你也删除了锁和管理文件吗?
-
我删除了枚举,删除了所有领域文件,包括锁定和管理,然后将架构重置为 0 并运行应用程序。我在上面粘贴了另一个关于 Product 类的致命错误,现在它的对象是必需的。该错误还表示需要迁移。所以我将模式设置为 1 并再次运行。重复键的错误又回来了。
-
这是一个查询或完全同步领域还是只是本地?沙盒是打开还是关闭?
-
只是本地和沙盒已关闭。
-
问题中缺少引发错误的代码。