为什么在升级了我的领域版本后,我不能再打开我的领域了



Realm Git 的相关问题

很长一段时间以来,我一直在我的swift应用程序中使用Realm 3.17.3。

让我们称之为应用程序版本1。

不久前,我更新了我的podfile以使用Realm 10.7.2。

让我们称之为应用程序版本2。

这样做之后,在模拟器上测试时,我的应用程序有时会在尝试打开默认领域文件时崩溃。

崩溃通常发生在我运行应用程序版本2,检查应用程序版本1,然后安装pod并运行应用程序时。

self._realm = try! Realm(configuration: configuration) // crash

领域给出的错误是:

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";我会有很多崩溃。

我的具体问题是:

  1. 为什么会发生这种崩溃?

  2. 我能做些什么来防止这次崩溃?

  3. 如果我把我的领域创建放在一个do catch中,我如何从catch中的这个错误中恢复过来?

TL;博士

简而言之,问题是Realm对底层数据结构进行了重大更改,从旧版本更改为新版本。虽然它不需要迁移*(对象架构不会更改(,但它确实需要在更新支持数据的同时更新SDK。这也需要相应地更新Realm Studio。

更多信息

以下是的问题

我一直在我的swift应用程序中使用Realm 3.17.3。

然后

更新了我的podfile以使用Realm 10.7.2。

来自Realm 10.0版本文档

注意:此版本升级Realm文件格式版本以添加支持新的数据类型。打开的领域文件将自动已升级,v10.0.0以前的版本无法读取。

这意味着支持现有Realm对象的数据完全改变了。因此,例如,使用Realm Studio(10+(打开您的Realm文件将更新您的所有数据(它确实显示了一条消息(,然后您现有的应用程序将无法再读取它,并将因此错误而崩溃

无效的顶部数组(参考号:53728,大小:11(路径:

请注意,如果您执行相反的操作,即更新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文档。

我想用降级应用程序版本成功管理领域数据库是不可能的。

因此,如果您当前的配置失败,解决方法是创建一个清晰的db文件:

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 {}
}

最新更新