你似乎做得对。按照realm documentation:
在最起码我们需要做的是更新版本与空块,表明该模式已经升级(自动)的境界。
我的猜测是,你要么创建配置和迁移,但不能将其设置为默认的领域配置,或将配置为时已晚(实例化一个境界后)。基于错误
你得到
提供的模式版本0低于最后一组第1版
似乎没有被所有执行的迁移。无论如何,每次更新架构时,您还应该增加schemaVersion
的领域配置。该错误意味着您的配置包含的版本(0
)小于磁盘中现有数据库的版本(1
)。在这种情况下,新配置的schemaVersion
至少应该为2
(任何高于磁盘中的版本)。
在应用程序委托的application:didFinishLaunchingWithOptions:
,你会最低限度需要像以往实例化境界,因为之前下列根据您当前的schemaVersion
。
let config = Realm.Configuration(
schemaVersion: 2, // Must be greater than previous version
migrationBlock: { migration, oldSchemaVersion in
if (oldSchemaVersion < 1) {
// minimally this can be empty
}
if (oldSchemaVersion < 2) {
// minimally this can be empty
}
print("Realm migration did run") // Log to know migration was executed
})
// Make sure to set the default configuration
Realm.Configuration.defaultConfiguration = config
我也建议你做一些记录或实例境界之前设置断点,无论是在迁移块,并在您的视图控制器。通过这种方式,您可以知道是否执行了迁移。
但是,由于您似乎只是在学习领域,所以我建议您现在忽略迁移的细节。为了避免这种情况,无论何时更改数据库模式,都可以从设备/模拟器中卸载应用程序。只要确保您使用schemaVersion
作为0
,并且您将始终拥有一个全新的数据库,因此无需迁移。
第二个选择是使用in-memory realms。这样的数据是不能跨应用程序启动持续的这些都不是保存到磁盘,但它仍然像一个正常境界数据库。这对于早期的原型制作来说非常完美。要得到其中的一个,你只需要给你的配置一个inMemoryIdentifier
。
let config = Realm.Configuration(inMemoryIdentifier: "ThisRealmIsNotStored")
Realm.Configuration.defaultConfiguration = config
这是我的AppDelegate的代码: Realm.Configuration.defaultConfiguration = Realm.Configuration( schemaVersion:1, migrationBlock:{迁移,oldSchemaVersion在 如果(oldSchemaVersion <1){ } }) let realm = try!境界() 工作正常,但是当它击中的ViewController它弹了。 当你说卸载应用程序你是什么意思? – Daniel
好了,想通了,你的意思与卸载的话 - 谢谢 之前,我决定用领域坚持我需要的是舒服,我就能得到正确的迁移,让我不要弄乱的用户体验。欣赏我试图重现你的错误没有成功采取 – Daniel
的时间。虽然我注意到在途中发生的一些细节,并将它们添加到答案中。 – Edman