ios - 将所有对象(保留它们的关系)从一个 Realm 复制到另一个 Realm

标签 ios swift realm

tl;dr:我试图将每个对象从一个 Realm 复制到另一个 Realm ,但我得到的对象数量是我应该得到的对象的两倍或四倍(我认为是因为它们的关系) .(编辑:我实际上得到了更多!在底部检查我的最后编辑。)

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

我有一个 Book 类和一个 ReadingSession 类。一本书可以有许多 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 对象,但没有复制与这些 Books 相关的 ReadingSessions。 所以我添加了一些代码来复制每个 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 复制到另一个 Realm ,保持它们的关系完整,并且不会像我现在这样获得重复项?

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

提前致谢,

丹尼尔


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

最佳答案

当您基于另一个 Realm 的对象创建新对象时,链接的对象也会被复制并递归到其中。但反向引用只是对象上的方便 getter ,模式既不知道也不可访问(对于 Swift),因此根本不会遍历它们。即使链接的对象被递归到,它们也根本不会自动去重。所以这会 loop for circular relations .

您可能想要配置 primary keyBook 上并使用 create(… update: true)复制您的ReadingSessions。当您复制这两本书时,您可以确保未读的书籍也被复制(如果这对于您的架构来说是有效的)。

关于ios - 将所有对象(保留它们的关系)从一个 Realm 复制到另一个 Realm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33428914/

相关文章:

ios - 突出显示 UIAlertView 中的单词? (加粗文字)

iphone - 停止 CAAnimation 以添加另一个 CAAnimation

ios - 无法通过 didSelectRow tableView 方法显示 View Controller

ios - 面向协议(protocol)编程和委托(delegate)模式

android - 我需要迁移才能将类型 Int 更改为 Long 吗?

ios - Swift Storyboard ListView 不起作用?

swift - 无法更改 iOS 11 中 UINavigationBar 的高度

ios - 实例化 Realm 对象时出现 EXC_BAD_INSTRUCTION

swift - 过滤子列表

ios - Swift 3 - 没有 'sort' 候选人产生预期的上下文结果类型 'NSMutableArray'