将所有对象(保留其关系)从一个领域复制到另一个领域

时间:2015-10-30 04:54:09

标签: ios swift realm

tl; dr:我正在尝试将每个对象从一个Realm复制到另一个,但是我得到的对象数量是我应该的两倍或对象的4倍(因为他们的关系,我认为) (编辑:我实际上还有很多!请查看我在底部的最后一次编辑。)

我正在尝试允许我的用户备份和恢复他们的Realm数据库。

我有一个Book班级和一个ReadingSession班级。 Book可以有多个ReadingSessions

class Book: Object {
    // (…)
    var readingSessions: [ReadingSession] {
        return linkingObjects(ReadingSession.self, forProperty: "book")
    }
}

class ReadingSession: Object {
    // (…)
    var book: Book?
}

要从备份中恢复,我尝试这样做:

func restoreBackupFile(backupFileToRestore: String) {
    // (…) I omitted the NSFileManager related part.
    let config = Realm.Configuration(path: "\(tmp)/ReadingLog.realm", readOnly: true)
    let backupRealm = try! Realm(configuration: config)
    let defaultRealm = try! Realm()

    let results = backupRealm.objects(Book)

    try! defaultRealm.write {

        for result in results {
            defaultRealm.create(Book.self, value: result)
        }
    }

复制了所有Book个对象,但没有复制与ReadingSessions相关的Books。 所以我添加了一些代码来复制每个ReadingSession

    // (…)
    let bookResults = backupRealm.objects(Book)
    let sessionResults = backupRealm.objects(ReadingSession)

    try! defaultRealm.write {

        for result in bookResults {
            defaultRealm.create(Book.self, value: result)
        }
        for result in sessionResults {
            defaultRealm.create(ReadingSession.self, value: result)
        }
    }

这给了我defaultRealm 4倍的书籍!我使用了一本包含10本书的数据库来测试它,在运行该代码后,我的默认Realm有40本书,其中20本与ReadingSessions相关联,20本没有任何ReadingSessions

我尝试仅复制ReadingSessions以查看是否也会创建相关的Books,然后我获得了Books的两倍,其中一半是正确的ReadingSessions,其中一半没有。

那我怎么做我想要的呢?将每个对象从一个Realm复制到另一个对象,保持他们的关系完好无损,而不像我现在那样得到重复?

(我知道我可以只替换数据库文件,但我希望我的用户能够从一个数据库恢复数据,而不会丢失另一个数据库中的数据。)

提前致谢,

丹尼尔

编辑:我一直在尝试更多内容,似乎如果我只复制ReadingSessions,它会为每个复制的阅读会话创建一本书,即使它们与同一本书。例如,如果我有一本有60个阅读课程的书,该书将被创建60次。所以我的问题比我想象的还要糟糕。当我复制Books时,他们没有附带相关的ReadingSessions。当我复制ReadingSessions时,他们会创作许多重复的书籍。

1 个答案:

答案 0 :(得分:2)

当您在另一个Realm的对象基础上创建新对象时,也会复制链接对象并将其递归。但反向引用只是对象上的便利getter,既不为架构所知也不可访问(对于Swift),因此它们根本就不会被遍历。即使链接对象被递归,它们也不会自动重复数据删除。所以这会loop for circular relations

您可能希望在Book上配置primary key并使用create(… update: true)复制ReadingSessions。当您同时复制这两本书时,您确保也会复制未读书籍,如果这是您的架构的有效案例。