首页 > 解决方案 > 领域错误:“主键属性 '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.

标签: swiftmigrationrealmkvc

解决方案


删除数据库中的所有数据,然后更新架构添加,更新后更新数据库必须设置新版本

更新版本代码

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);
 }

推荐阅读