在Realms之间复制对象时需要迁移

时间:2015-10-31 08:06:56

标签: ios swift realm

我正在尝试在两个Realm数据库之间复制对象。第一个数据库的模式是版本0,第二个是版本1.

10-31 13:18:05.124: D/SocialAuthError(21880): org.brickred.socialauth.exception.SocialAuthException: org.brickred.socialauth.exception.SocialAuthException: Status not updated. Return Status code :403
10-31 13:18:05.124: W/System.err(21880): org.brickred.socialauth.android.SocialAuthError: Message Not Posted
10-31 13:18:05.124: W/System.err(21880):    at org.brickred.socialauth.android.SocialAuthAdapter$6.run(SocialAuthAdapter.java:868)
10-31 13:18:05.124: W/System.err(21880):    at java.lang.Thread.run(Thread.java:818)

当我用旧版本替换当前的Realm数据库文件时,迁移工作完美。但是如果不是替换文件而是尝试在它们之间复制对象,我会得到“对象需要迁移”等等。

我尝试在每个配置中明确说明路径,schemaVersions和migrationBlocks,但这没关系。

我做错了什么?

提前致谢,

丹尼尔

1 个答案:

答案 0 :(得分:2)

好的,经过一段时间的迁移示例后,我设法将其整理出来。

我不得不将新的schemaVersion(1)添加到旧Realm数据库的配置中,这对我来说似乎有点直观了:

        let backupConfig = Realm.Configuration(
            path: "\(tmp)/ReadingLog.realm", // This file is version 0
            readOnly: true,
            schemaVersion: 1 // But I have to set this to version 1
        )

我认为schemaVersion应该是这个数据库的版本,因此Realm会知道来自要迁移的版本,但实际上它似乎是 new 版本I希望它将迁移到

然后我必须在此之后立即致电migrateRealm(backupConfig)。然后它奏效了!

所以这是工作代码:

        let backupConfig = Realm.Configuration(
            path: "\(tmp)/ReadingLog.realm",
            readOnly: true,
            schemaVersion: 1
        )
        migrateRealm(backupConfig)

        let backupRealm = try! Realm(configuration: backupConfig)
        let defaultRealm = try! Realm()

        let books = backupRealm.objects(Book)

        try! defaultRealm.write {

            for book in books {
                defaultRealm.create(Book.self, value: book, update: true)
            }
        }