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 key在 Book
上并使用 create(… update: true)
复制您的ReadingSessions
。当您复制这两本书时,您可以确保未读的书籍也被复制(如果这对于您的架构来说是有效的)。
关于ios - 将所有对象(保留它们的关系)从一个 Realm 复制到另一个 Realm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33428914/