为什么我的realm版本升级后打不开了
Why can I no longer open my realm after upgrading my realm version
很长一段时间以来,我一直在我的 swift 应用程序中使用 Realm 3.17.3。
我们称其为应用程序版本 1。
不久前我更新了我的 podfile 以使用 Realm 10.7.2。
我们称该应用程序为版本 2。
执行此操作后以及在模拟器上进行测试时,我的应用程序在尝试打开默认领域文件时有时会崩溃。
崩溃通常发生在我运行安装应用程序版本 2,检查应用程序版本 1,然后执行 pod 安装和 运行 应用程序时。
self._realm = try! Realm(configuration: configuration) // crash
realm给出的错误是:
NSError domain: "io.realm" - code: 2
"NSFilePath" : "../Library/Developer/CoreSimulator/Devices/15EF6132-9EA7-4946-81E4-78B48B8AC5E1/data/Containers/Data/Application/2BEC8269-1CD1-4D5D-A25F-A166D0AD5E73/Documents/default.realm"
"Underlying" : "Invalid top array (ref: 53728, size: 11) Path: ../Library/Developer/CoreSimulator/Devices/15EF6132-9EA7-4946-81E4-78B48B8AC5E1/data/Containers/Data/Application/2BEC8269-1CD1-4D5D-A25F-A166D0AD5E73/Documents/default.realm"
"NSLocalizedDescription" : "Unable to open a realm at path \'../Library/Developer/CoreSimulator/Devices/15EF6132-9EA7-4946-81E4-78B48B8AC5E1/data/Containers/Data/Application/2BEC8269-1CD1-4D5D-A25F-A166D0AD5E73/Documents/default.realm\': Invalid top array (ref: 53728, size: 11) Path:."
我最好的猜测是崩溃是因为较新版本的领域正在被较旧版本的领域取代。
我知道这不太可能是真实世界的场景,但我担心当我发布我的“应用程序版本 2”时,我会遇到很多崩溃。
我的具体问题是:
为什么会发生此崩溃?
我能做些什么来防止这次崩溃?
如果我将我的领域创建放在一个 do catch 中,我怎样才能从 catch 中的这个错误中恢复?
我想通过降级应用程序版本无法成功管理领域数据库。
因此,解决方法是在当前配置失败时创建清晰的数据库文件,如下所示:
let config = Realm.Configuration(
schemaVersion: currentVersion,
migrationBlock: { migration, oldSchemaVersion in })
do {
realm = try Realm(configuration: config)
} catch let error {
logger.error("Realm migration failed with error: \(error.localizedDescription)")
// if migration failed
let clearConfig = Realm.Configuration(
schemaVersion: currentVersion,
deleteRealmIfMigrationNeeded: true
)
do { realm = try Realm(configuration: clearConfig) } catch {}
}
TL;DR
简而言之,问题是 Realm 从旧版本到新版本对底层数据结构进行了重大更改。虽然它不需要迁移*(对象架构不会更改),但它确实需要在更新支持数据的同时更新 SDK。这也需要相应更新Realm Studio。
更多信息
这是问题所在
I've been using Realm 3.17.3 in my swift app.
然后
updated my podfile to use Realm 10.7.2.
NOTE: This version upgrades the Realm file format version to add
support for new data types. Realm files opened will be automatically
upgraded and cannot be read by versions older than v10.0.0.
也就是说,支持现有 Realm 对象的数据已完全改变。因此,例如,使用 Realm Studio(10+)打开你的 Realm 文件将更新你的所有数据(它确实显示一条消息)然后你现有的应用程序将不再能够读取它并且会因这个错误而崩溃
Invalid top array (ref: 53728, size: 11) Path:
另请注意,如果您执行相反的操作,更新 SDK 并尝试使用 Realm Studio 打开 Realm 并收到该错误,则说明您使用的是旧版本的 Realm Studio。您需要更新到 Realm Studio 10.0 或更高版本。
请注意,更新到 10.0 或更高版本后,该版本将无法再打开旧版 Realm Cloud 或 Realm Object Server。为此,您需要保留版本 5.x。
*如果您使用的是 Realm Sync/MongoDB Realm Sync,则与之前的版本相比会有重大变化。请查看 MongoDB Realm Sync 文档。
很长一段时间以来,我一直在我的 swift 应用程序中使用 Realm 3.17.3。
我们称其为应用程序版本 1。
不久前我更新了我的 podfile 以使用 Realm 10.7.2。
我们称该应用程序为版本 2。
执行此操作后以及在模拟器上进行测试时,我的应用程序在尝试打开默认领域文件时有时会崩溃。
崩溃通常发生在我运行安装应用程序版本 2,检查应用程序版本 1,然后执行 pod 安装和 运行 应用程序时。
self._realm = try! Realm(configuration: configuration) // crash
realm给出的错误是:
NSError domain: "io.realm" - code: 2
"NSFilePath" : "../Library/Developer/CoreSimulator/Devices/15EF6132-9EA7-4946-81E4-78B48B8AC5E1/data/Containers/Data/Application/2BEC8269-1CD1-4D5D-A25F-A166D0AD5E73/Documents/default.realm"
"Underlying" : "Invalid top array (ref: 53728, size: 11) Path: ../Library/Developer/CoreSimulator/Devices/15EF6132-9EA7-4946-81E4-78B48B8AC5E1/data/Containers/Data/Application/2BEC8269-1CD1-4D5D-A25F-A166D0AD5E73/Documents/default.realm"
"NSLocalizedDescription" : "Unable to open a realm at path \'../Library/Developer/CoreSimulator/Devices/15EF6132-9EA7-4946-81E4-78B48B8AC5E1/data/Containers/Data/Application/2BEC8269-1CD1-4D5D-A25F-A166D0AD5E73/Documents/default.realm\': Invalid top array (ref: 53728, size: 11) Path:."
我最好的猜测是崩溃是因为较新版本的领域正在被较旧版本的领域取代。
我知道这不太可能是真实世界的场景,但我担心当我发布我的“应用程序版本 2”时,我会遇到很多崩溃。
我的具体问题是:
为什么会发生此崩溃?
我能做些什么来防止这次崩溃?
如果我将我的领域创建放在一个 do catch 中,我怎样才能从 catch 中的这个错误中恢复?
我想通过降级应用程序版本无法成功管理领域数据库。
因此,解决方法是在当前配置失败时创建清晰的数据库文件,如下所示:
let config = Realm.Configuration(
schemaVersion: currentVersion,
migrationBlock: { migration, oldSchemaVersion in })
do {
realm = try Realm(configuration: config)
} catch let error {
logger.error("Realm migration failed with error: \(error.localizedDescription)")
// if migration failed
let clearConfig = Realm.Configuration(
schemaVersion: currentVersion,
deleteRealmIfMigrationNeeded: true
)
do { realm = try Realm(configuration: clearConfig) } catch {}
}
TL;DR
简而言之,问题是 Realm 从旧版本到新版本对底层数据结构进行了重大更改。虽然它不需要迁移*(对象架构不会更改),但它确实需要在更新支持数据的同时更新 SDK。这也需要相应更新Realm Studio。
更多信息
这是问题所在
I've been using Realm 3.17.3 in my swift app.
然后
updated my podfile to use Realm 10.7.2.
NOTE: This version upgrades the Realm file format version to add support for new data types. Realm files opened will be automatically upgraded and cannot be read by versions older than v10.0.0.
也就是说,支持现有 Realm 对象的数据已完全改变。因此,例如,使用 Realm Studio(10+)打开你的 Realm 文件将更新你的所有数据(它确实显示一条消息)然后你现有的应用程序将不再能够读取它并且会因这个错误而崩溃
Invalid top array (ref: 53728, size: 11) Path:
另请注意,如果您执行相反的操作,更新 SDK 并尝试使用 Realm Studio 打开 Realm 并收到该错误,则说明您使用的是旧版本的 Realm Studio。您需要更新到 Realm Studio 10.0 或更高版本。
请注意,更新到 10.0 或更高版本后,该版本将无法再打开旧版 Realm Cloud 或 Realm Object Server。为此,您需要保留版本 5.x。
*如果您使用的是 Realm Sync/MongoDB Realm Sync,则与之前的版本相比会有重大变化。请查看 MongoDB Realm Sync 文档。