领域迁移问题

时间:2015-10-14 17:12:34

标签: ios migration realm

我为加载看似重复的问题而道歉。

我是第一次尝试Realm - 我创建了一个测试项目来完成它。我向我的模型类添加了另一个属性,然后获得了有关更改和迁移所需的错误消息。我按照说明在AppDelegate中设置了一些代码用于迁移(虽然迁移块是空的,因为我删除了所有记录)但是当它再次启动后它到达我的ViewController时它崩溃了"提供的模式版本0小于最后一个版本1"而我却无法超越它?

我的ViewController在var realm = try中失败了!境界()

我错过了什么?

1 个答案:

答案 0 :(得分:4)

你似乎做得对。根据{{​​3}}:

  

至少我们需要做的是使用空块更新版本,以表明架构已被Realm升级(自动)。< / p>

我的猜测是你要么创建配置和迁移,要么不将其设置为默认域配置,要么设置配置太晚(在实例化之后)。

根据你得到的错误

  

提供的架构版本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,您将始终拥有一个全新的数据库,因此不需要迁移。

第二种选择是使用realm documentation。这些不会保存到磁盘,因此数据在应用程序启动时不会持续存在,但它仍然像普通的领域数据库一样工作。这非常适合早期原型设计。要获得其中一个,您只需要为您的配置inMemoryIdentifier

let config = Realm.Configuration(inMemoryIdentifier: "ThisRealmIsNotStored")
Realm.Configuration.defaultConfiguration = config
相关问题