我正在尝试使用以下代码执行Realm迁移:
let version = try! schemaVersionAtURL(Realm.Configuration.defaultConfiguration.fileURL!)
let config = Realm.Configuration(
schemaVersion: version + 1,
migrationBlock: { migration, oldSchemaVersion in
if oldSchemaVersion < 1 {
migration.enumerateObjects(ofType: MyObject.className()) { oldObject, newObject in
// Here I transfer existing data to new properties
}
}
})
Realm.Configuration.defaultConfiguration = config
let _ = try! Realm()
迁移似乎工作正常,但是下次重新启动该应用程序时,尽管已将第一次启动期间的迁移设置为1,但当前和旧架构版本均为0。
但是迁移已完成,因此if
条件为真,并且由于尝试再次执行迁移而导致的Realm异常导致应用程序崩溃。
有人可以帮助我了解我所缺少的吗?如果配置在迁移过程中将架构版本设置为1,为什么下次重新启动该应用程序时将其设置为0?
答案 0 :(得分:0)
迁移似乎可以正常进行,但是下次应用程序运行时 重新启动,当前和旧模式版本均为0,
这是在删除本地Realm
文件并重新安装时引起的,通常是在删除并重新安装应用程序后出现,
Realm
自动处理迁移,仅需知道是否有新版本号即可使文件使用新规则自行重写即可。
现在,对于崩溃的部分,您正在使用它,这是github
上 open 统计信息的问题let version = try! schemaVersionAtURL(Realm.Configuration.defaultConfiguration.fileURL!)
但是我同意this评论。
我猜这里有两个问题:
1-听起来
schemaVersionAtURL()
正在创建一个空文件 一个不存在的文件的URL,显然不应 那样做。
2-在SwiftschemaVersionAtURL()
中应该是UInt64?
如果文件不存在则返回nil而不是抛出
我建议使用普通的Int
作为版本,而不是从文件中获取它,
如Realm
documents,schemaVersion: 1
中显示的那样,并手动对其进行递增,这将使您始终可以看到所使用的版本号,并且当崩溃时,您知道自己做了一些值得移植的事情。
现在您要说的部分。
当前和旧架构版本均为0
当您重新安装应用程序时,它只是重新创建了版本0的文件,因为您的代码实施的新规则将Realm
只是其简单的新文件,因此将模式版本设置为较低的代码不会有太大作用,但是不建议您这样做,因为上线时人们不会重新安装应用程序,而是会更新它,因此Realm
文件将迁移到较高版本,但是新用户下载的应用程序的版本号为0
,因此多考虑一下它,因为需要进行更改,而不是增加一个数字,而越大越好。
答案 1 :(得分:0)
事实证明,该问题实际上是在执行迁移之前调用Realm的。我忘记了在willFinishingLaunchingWithOptions
中运行的调用它的一些代码。
经验教训:只有对Realm的第一次调用才能执行迁移。