Swift 域快速迁移以添加主键-不写入数据

Swift 域快速迁移以添加主键-不写入数据,swift,realm,database-migration,Swift,Realm,Database Migration,我正在使用RealmSwift,我想向我的一个对象添加一个新的主键 我已将Realm对象更新为 class Trip: Object { dynamic var id = "" dynamic var start = "" dynamic var startAddress = "" dynamic var end = "" dynamic var endAddress = "" dynamic var purpose = "" dynamic var distance

我正在使用RealmSwift,我想向我的一个对象添加一个新的主键

我已将Realm对象更新为

class Trip: Object {
  dynamic var id = ""
  dynamic var start = ""
  dynamic var startAddress = ""
  dynamic var end = ""
  dynamic var endAddress = ""
  dynamic var purpose = ""
  dynamic var distance = 0.0
  dynamic var tripDate = NSDate()
  dynamic var month = 0
  dynamic var year = 0
  dynamic var isWalking = false
  dynamic var isReturn = false

func primaryKey() -> String {
    return id
}
}

现在我想迁移到新版本,并插入一个UUID字符串作为任何现有记录的主键

迁移的工作原理是创建了新的“id”字段,但UUID字符串未写入记录中。控制台上没有显示错误

这是我添加到AppDelegate应用程序中的内容(应用程序:didFinishLaunchingWithOptions:)

我肯定遗漏了什么,但我无法从Realm站点上的文档或示例中确定遗漏了什么

        let config = Realm.Configuration(
        // Set the new schema version. This must be greater than the previously used
        // version (if you've never set a schema version before, the version is 0).
        schemaVersion: 1,

        // Set the block which will be called automatically when opening a Realm with
        // a schema version lower than the one set above
        migrationBlock: { migration, oldSchemaVersion in
            // We haven’t migrated anything yet, so oldSchemaVersion == 0
            if (oldSchemaVersion < 1) {
                // Nothing to do!
                // Realm will automatically detect new properties and removed properties
                // And will update the schema on disk automatically
            }
    })

    // Tell Realm to use this new configuration object for the default Realm
    Realm.Configuration.defaultConfiguration = config

    // Now that we've told Realm how to handle the schema change, opening the file
    // will automatically perform the migration
    let realm = try! Realm()

    Realm.Configuration.defaultConfiguration = Realm.Configuration(
        schemaVersion: 1,
        migrationBlock: { migration, oldSchemaVersion in
            if (oldSchemaVersion < 1) {
                // The enumerate(_:_:) method iterates
                // over every Trip object stored in the Realm file
                migration.enumerate(Trip.className()) { oldObject, newObject in
                    let id = NSUUID().UUIDString
                    newObject!["id"] = id
                }
            }
    })
let config=Realm.Configuration(
//设置新架构版本。该版本必须大于以前使用的版本
//版本(如果以前从未设置过架构版本,则版本为0)。
阴谋厌恶:1,
//设置使用打开域时自动调用的块
//低于上面设置的架构版本
migrationBlock:{migration,oldSchemaVersion in
//我们还没有迁移任何内容,所以oldSchemaVersion==0
if(oldschemaversation<1){
//无事可做!
//领域将自动检测新属性和删除的属性
//并将自动更新磁盘上的架构
}
})
//告诉领域将此新配置对象用于默认领域
Realm.Configuration.defaultConfiguration=config
//现在我们已经告诉Realm如何处理模式更改,打开文件
//将自动执行迁移
让我试试!领域()
Realm.Configuration.defaultConfiguration=Realm.Configuration(
阴谋厌恶:1,
migrationBlock:{migration,oldSchemaVersion in
if(oldschemaversation<1){
//枚举(::)方法迭代
//在域文件中存储的每个Trip对象上
migration.enumerate(Trip.className()){oldObject,newObject在
设id=nsuid().uuiString
新对象![“id”]=id
}
}
})

您提供的代码在您已经打开领域后设置迁移块的默认配置。您需要在打开默认域之前设置默认配置,以便使用迁移块。

您提供的代码在您打开域之后设置迁移块的默认配置。您需要在打开默认领域之前设置默认配置,以便使用迁移块。这只是问题中的一个复制粘贴错误,还是反映了您正在测试的代码?是的,我知道我现在做了什么。在我打开领域之后,我在块中有一个太多的配置块和迁移填充。我刚刚将迁移块移到了第一个配置块中,并删除了第二个配置块,现在它可以正常工作了。我已经重新发布了我的评论作为答案,因为它解决了您的问题。