2017-01-20 6 views
0

Предположим, у меня есть база данных с следующей структурой:Realm createOrUpdate сложный объект

@interface User: RLMObject 
    RLMArray<Match>* matches; 
@end 

@interface Match: RLMObject 
    RLMArray<Round>* rounds; 
    RLMArray<User>* players; 
@end 

@interface Round: RLMObject 
    User* nextMoveUser; 
@end 

И я хотел бы, чтобы обновить существующий объект пользователя, который уже успел в Realm со всеми вложенными свойствами:

User* user = ... // Get unmanaged User, 
       // parsed from API 
       // with unmanaged parsed nested mathces and round 

RLMRealm* realm = [RLMRealm defaultRealm]; 
[realm beginWriteTransaction]; 
[realm addOrUpdateObject: user]; 
[realm commitWriteTransaction]; 

Вопрос: будет ли Realm обновлять все вложенные объекты, а также главный User? P.S .: Я спрашиваю об этом, потому что мне приходится сталкиваться с некоторыми проблемами с обновлением [Round nextMoveUser]. После обновления он становится нулевым. Хотя отладчик показывает, что все в порядке с анализируемой сущностью.

Также я бы высоко оценил, если кто-то может объяснить, как все работает внутри, когда дело касается таких типов ссылок.

ответ

1

Вы должны быть осторожны при обновлении RLMObject с помощью неуправляемой копии самого себя. Поскольку nil является допустимым значением, если копия не содержит всю ту же информацию, что и оригинал, эти исходные значения будут удалены.

Это относится также к объектам RLMArray, поскольку пустой массив также считается допустимым значением; вам необходимо убедиться, что ваши массивы и содержимое также действительны.

Одним из простых способов упростить эту задачу является использование NSDictionary вместо неуправляемой копии для обновления объекта Realm. Таким образом, вы можете явно указать, какие свойства обновляются, а какие - в одиночку.

Я точно не знаю, как ответить на ваш вопрос о том, как все работает внутри страны. Но достаточно сказать, что дочерние объекты напрямую не принадлежат их родительским объектам. Более того, оба объекта существуют и действуют независимо друг от друга, но родитель поддерживает взаимосвязь связанных списков, указывающих на ребенка. Даже если эти отношения удалены, объект все равно останется в базе данных.

Смежные вопросы