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
时,他们会创作许多重复的书籍。
答案 0 :(得分:2)
当您在另一个Realm的对象基础上创建新对象时,也会复制链接对象并将其递归。但反向引用只是对象上的便利getter,既不为架构所知也不可访问(对于Swift),因此它们根本就不会被遍历。即使链接对象被递归,它们也不会自动重复数据删除。所以这会loop for circular relations。
您可能希望在Book
上配置primary key并使用create(… update: true)
复制ReadingSessions
。当您同时复制这两本书时,您确保也会复制未读书籍,如果这是您的架构的有效案例。