swift - 领域错误:“主键属性 'Product.upc' 在迁移后具有重复值。”
问题描述
我有一个使用 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.
解决方案
删除数据库中的所有数据,然后更新架构添加,更新后更新数据库必须设置新版本
更新版本代码
export default new Realm({
schema: [class1, class2, classN],
schemaVersion: 2 // set new version
});
删除所有数据的代码
try {
realm.beginTransaction();
realm.deleteAll();
realm.commitTransaction();
} catch (error) {
console.log(error);
}
推荐阅读
- amazon-web-services - 将 EBS 卷映射到 Jenkins Home 以进行 Packer 构建
- javascript - 带有新元素的 Nodemailer
- ruby-on-rails - CounterCache 不适用于多态关联
- c++ - 如何使用线程类编译 cpp 文件?
- c++ - 展开可变参数模板结构
- angularjs - 具有不同保存选项的 Angular MaterialJS 对话框表单
- php - 如何在不使用 markdown 的情况下将纯文本版本添加到 Laravel 电子邮件
- smtp - Msmtprc SMTP 与 Office365
- python - pyswagger 中的解析错误:ValueError: Can't resolve type from:(String, )
- c - C中的指针及其值