首页 > 解决方案 > 为什么迁移后 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?

标签: swiftrealmrealm-migration

解决方案


迁移似乎工作正常,但是下次重新启动应用程序时,当前和旧架构版本都是 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,所以更多地考虑它作为需要进行的更改 而不是增量编号只是更大更好


推荐阅读