2015-10-14 73 views
0

我很抱歉加载可能看起来像是重复的问题。领域迁移问题

我第一次尝试Realm - 我创建了一个测试项目来完成它。我在模型类中添加了另一个属性,然后得到了有关所需更改和迁移的错误消息。我遵循指示,并在AppDelegate中设置了一些代码进行迁移(尽管迁移块是空的,因为我删除了所有记录),但是在再次启动后它碰到我的ViewController时崩溃,“提供的模式版本0比上一次设置的版本少1“,我无法超越它?

它在我的ViewController上失败var realm = try! Realm()

我错过了什么?

回答

4

你似乎做得对。按照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 
+0

这是我的AppDelegate的代码: Realm.Configuration.defaultConfiguration = Realm.Configuration( schemaVersion:1, migrationBlock:{迁移,oldSchemaVersion在 如果(oldSchemaVersion <1){ } }) let realm = try!境界() 工作正常,但是当它击中的ViewController它弹了。 当你说卸载应用程序你是什么意思? – Daniel

+0

好了,想通了,你的意思与卸载的话 - 谢谢 之前,我决定用领域坚持我需要的是舒服,我就能得到正确的迁移,让我不要弄乱的用户体验。欣赏我试图重现你的错误没有成功采取 – Daniel

+0

的时间。虽然我注意到在途中发生的一些细节,并将它们添加到答案中。 – Edman