Swift 域快速迁移以添加主键-不写入数据
我正在使用RealmSwift,我想向我的一个对象添加一个新的主键 我已将Realm对象更新为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
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
}
}
})
您提供的代码在您已经打开领域后设置迁移块的默认配置。您需要在打开默认域之前设置默认配置,以便使用迁移块。您提供的代码在您打开域之后设置迁移块的默认配置。您需要在打开默认领域之前设置默认配置,以便使用迁移块。这只是问题中的一个复制粘贴错误,还是反映了您正在测试的代码?是的,我知道我现在做了什么。在我打开领域之后,我在块中有一个太多的配置块和迁移填充。我刚刚将迁移块移到了第一个配置块中,并删除了第二个配置块,现在它可以正常工作了。我已经重新发布了我的评论作为答案,因为它解决了您的问题。