swift - 为什么迁移后 Realm 的架构版本会重置为 0?
问题描述
我正在尝试使用以下代码执行领域迁移:
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()
迁移似乎工作正常,但下次重新启动应用程序时,当前和旧架构版本均为 0,尽管在第一次启动期间发生的迁移已将其设置为 1。
但是迁移已经完成,因此if
条件为真,并且应用程序崩溃并由于尝试再次执行迁移而导致 Realm 异常。
谁能帮我理解我错过了什么?如果配置在迁移过程中将架构版本设置为 1,为什么下次重新启动应用程序时为 0?
解决方案
迁移似乎工作正常,但是下次重新启动应用程序时,当前和旧架构版本都是 0,
这是删除本地Realm
文件并重新安装时引起的,通常在您删除并重新安装应用程序时发生,
Realm
自动处理迁移,它需要知道是否有新版本号会导致文件使用新规则自行重写。
现在对于崩溃部分,您正在使用它,这是github上的一个开放统计信息的问题
let version = try! schemaVersionAtURL(Realm.Configuration.defaultConfiguration.fileURL!)
不过我同意这个评论。
我想这里有两个问题:
schemaVersionAtURL()
1-如果给定一个不存在的文件的 URL,这听起来像是在创建一个空文件,显然不应该这样做。
2-在 SwiftschemaVersionAtURL()
中应该是UInt64?
并且如果文件不存在则返回 nil 而不是抛出
我建议Int
对版本使用纯文本,而不是从文件中获取它,就像它在Realm
文档中显示的那样,schemaVersion: 1
并手动递增它,这将让你始终看到你所在的版本号,当它崩溃时你知道你做了一些值得迁移的事情。
现在是你说的部分。
当前和旧模式版本都是 0
当您重新安装应用程序时,它只需重新创建版本为 0 的文件,因为您的代码实施的新规则Realm
只是简单的新文件,因此将架构版本设置为较低的代码不会做很多事情,但是不建议这样做,因为当您上线时人们不会重新安装应用程序,他们会更新它,因此Realm
文件被迁移到更高版本,但是新用户下载的应用程序带有版本号0
,所以更多地考虑它作为需要进行的更改 而不是增量编号只是更大更好。
推荐阅读
- vba - 基于服务器的规则将 500 多个地址整理到约 150 个收件箱文件夹中
- swift - 如何快速从字符串值中删除可选?
- java - 如何使用 apache camel dsl 删除 csv 的标头
- c - 如何修复“调试错误!,变量'x'周围的堆栈已损坏”?
- azure - AS2 消息接收器
- wpf - 用于编辑数据网格的复杂属性的弹出窗口
- java - 将 ES 查询转换为按键和值对嵌套对象进行排序到 Java API(ES 版本 6.2)的问题
- python - 我可以在 python 函数中读取 Excel 文件时锁定它吗?
- git - 错误消息:第一次为新项目克隆存储库时目录名称无效
- python - 2x 嵌套函数中的访问列表