为什么迁移后 Realm 的架构版本会重置为 0?
Why does a Realm's schema version reset to 0 after a migration?
我正在尝试使用以下代码执行领域迁移:
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?
The migration seems to work fine, but the next time the app is
relaunched, both the current and old schema versions are 0,
这是您删除本地 Realm
文件并重新安装时造成的,通常发生在您删除并重新安装应用程序时,
Realm
自动处理迁移,它需要知道是否有新版本号会导致文件使用新规则自行重写。
现在对于崩溃的部分,你正在使用这个,open stat on github
的问题
let version = try! schemaVersionAtURL(Realm.Configuration.defaultConfiguration.fileURL!)
不过我同意 this 评论。
I guess there's two issues here:
1- It sounds like schemaVersionAtURL()
is creating an empty file if given
a URL for a file that doesn't exist, and it obviously shouldn't be
doing that.
2- In Swift schemaVersionAtURL()
should be UInt64?
and just
return nil if the file doesn't exist rather than throwing
我建议使用纯 Int
作为版本而不是从文件中获取它,
正如它在 Realm
documents、schemaVersion: 1
中显示的那样,并手动增加它,这将让您始终看到您所在的版本号,当它崩溃时您知道您做了一些值得迁移的事情。
现在轮到你说的那部分了。
both the current and old schema versions are 0
当您重新安装您的应用程序时,它只是重新创建版本为 0 的文件,因为您的代码实施的新规则 Realm
它只是简单的新文件,因此在代码中将模式版本设置为较低不会做太多,然而,不推荐这样做,因为当你上线时人们不会重新安装应用程序,他们会更新它,因此 Realm
文件被迁移到更高版本,但是新用户下载版本号 0
的应用程序,因此请多考虑一下,因为需要进行更改 而不是增量数字,只有越大越好 。
事实证明问题实际上是在执行迁移之前调用 Realm。我忘记了 运行 在 willFinishingLaunchingWithOptions
中调用它的一些代码。
经验教训:只有第一次调用 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()
迁移似乎工作正常,但下次重新启动应用程序时,当前和旧架构版本均为 0,尽管在第一次启动期间发生的迁移已将其设置为 1。
但是迁移已经完成,所以if
条件为真,再次尝试执行迁移导致应用程序崩溃并出现Realm异常。
任何人都可以帮助我了解我所缺少的吗?如果配置在迁移期间将架构版本设置为 1,为什么下次重新启动应用程序时它是 0?
The migration seems to work fine, but the next time the app is relaunched, both the current and old schema versions are 0,
这是您删除本地 Realm
文件并重新安装时造成的,通常发生在您删除并重新安装应用程序时,
Realm
自动处理迁移,它需要知道是否有新版本号会导致文件使用新规则自行重写。
现在对于崩溃的部分,你正在使用这个,open stat on github
的问题let version = try! schemaVersionAtURL(Realm.Configuration.defaultConfiguration.fileURL!)
不过我同意 this 评论。
I guess there's two issues here:
1- It sounds like
schemaVersionAtURL()
is creating an empty file if given a URL for a file that doesn't exist, and it obviously shouldn't be doing that.
2- In SwiftschemaVersionAtURL()
should beUInt64?
and just return nil if the file doesn't exist rather than throwing
我建议使用纯 Int
作为版本而不是从文件中获取它,
正如它在 Realm
documents、schemaVersion: 1
中显示的那样,并手动增加它,这将让您始终看到您所在的版本号,当它崩溃时您知道您做了一些值得迁移的事情。
现在轮到你说的那部分了。
both the current and old schema versions are 0
当您重新安装您的应用程序时,它只是重新创建版本为 0 的文件,因为您的代码实施的新规则 Realm
它只是简单的新文件,因此在代码中将模式版本设置为较低不会做太多,然而,不推荐这样做,因为当你上线时人们不会重新安装应用程序,他们会更新它,因此 Realm
文件被迁移到更高版本,但是新用户下载版本号 0
的应用程序,因此请多考虑一下,因为需要进行更改 而不是增量数字,只有越大越好 。
事实证明问题实际上是在执行迁移之前调用 Realm。我忘记了 运行 在 willFinishingLaunchingWithOptions
中调用它的一些代码。
经验教训:只有第一次调用 Realm 才会执行迁移。