迁移后,为何Realm的架构版本重置为0?

时间:2019-03-19 06:02:16

标签: swift realm realm-migration

我正在尝试使用以下代码执行Realm迁移:

let version = try! schemaVersionAtURL(Realm.Configuration.defaultConfiguration.fileURL!)
let config = Realm.Configuration(
            schemaVersion: version + 1,
            migrationBlock: { migration, oldSchemaVersion in
                if oldSchemaVersion < 1 {
                    migration.enumerateObjects(ofType: MyObject.className()) { oldObject, newObject in
                        // Here I transfer existing data to new properties
                    }
                }
        })
Realm.Configuration.defaultConfiguration = config
let _ = try! Realm()

迁移似乎工作正常,但是下次重新启动该应用程序时,尽管已将第一次启动期间的迁移设置为1,但当前和旧架构版本均为0。

但是迁移已完成,因此if条件为真,并且由于尝试再次执行迁移而导致的Realm异常导致应用程序崩溃。

有人可以帮助我了解我所缺少的吗?如果配置在迁移过程中将架构版本设置为1,为什么下次重新启动该应用程序时将其设置为0?

2 个答案:

答案 0 :(得分:0)

  

迁移似乎可以正常进行,但是下次应用程序运行时   重新启动,当前和旧模式版本均为0,

这是在删除本地Realm文件并重新安装时引起的,通常是在删除并重新安装应用程序后出现,

Realm自动处理迁移,仅需知道是否有新版本号即可使文件使用新规则自行重写即可。


现在,对于崩溃的部分,您正在使用它,这是github

open 统计信息的问题
let version = try! schemaVersionAtURL(Realm.Configuration.defaultConfiguration.fileURL!)

但是我同意this评论。

  

我猜这里有两个问题:

     

1-听起来schemaVersionAtURL()正在创建一个空文件   一个不存在的文件的URL,显然不应   那样做。
  2-在Swift schemaVersionAtURL()中应该是UInt64?   如果文件不存在则返回nil而不是抛出

我建议使用普通的Int作为版本,而不是从文件中获取它, 如Realm documentsschemaVersion: 1中显示的那样,并手动对其进行递增,这将使您始终可以看到所使用的版本号,并且当崩溃时,您知道自己做了一些值得移植的事情。

现在您要说的部分。

  

当前和旧架构版本均为0

当您重新安装应用程序时,它只是重新创建了版本0的文件,因为您的代码实施的新规则将Realm只是其简单的新文件,因此将模式版本设置为较低的代码不会有太大作用,但是不建议您这样做,因为上线时人们不会重新安装应用程序,而是会更新它,因此Realm文件将迁移到较高版本,但是新用户下载的应用程序的版本号为0,因此多考虑一下它,因为需要进行更改,而不是增加一个数字,而越大越好。

答案 1 :(得分:0)

事实证明,该问题实际上是在执行迁移之前调用Realm的。我忘记了在willFinishingLaunchingWithOptions中运行的调用它的一些代码。

经验教训:只有对Realm的第一次调用才能执行迁移。