假设我有一个具有以下结构的数据库:
libssh.dll.a
我想更新已在Realm中使用所有嵌套属性管理的现有User对象:
@interface User: RLMObject
RLMArray<Match>* matches;
@end
@interface Match: RLMObject
RLMArray<Round>* rounds;
RLMArray<User>* players;
@end
@interface Round: RLMObject
User* nextMoveUser;
@end
问题是: Realm会更新所有嵌套对象以及主要对象用户吗? P.S。:我问这个,因为我在更新[Round nextMoveUser]时遇到了一些麻烦。更新后变为零。虽然调试器显示所有东西都可以解析实体。
如果有人可以解释,当涉及到这类参考时,内心的工作方式也会让我感到高兴。
答案 0 :(得分:1)
使用非托管自身副本更新RLMObject
时需要小心。由于nil
是有效值,如果副本不包含与原始信息相同的所有信息,则这些原始值将被删除。
这也适用于RLMArray
个对象,因为空数组也算作有效值;你需要确保你的数组和内容也是有效的。
使这更容易处理的一种简单方法是使用NSDictionary
而不是非托管副本来更新Realm对象。这样,您就可以明确地指示哪些属性已更新,哪些属性保持不变。
我不确定如何回答关于内部如何运作的问题。但足以说明,子对象不是由父对象直接拥有的。此外,两个对象彼此独立存在和操作,但父对象保持指向子对象的链表关系。即使删除了该关系,该对象仍将保留在数据库中。