Правильный способ реализации отношений один-ко-многим в Царстве

Я изучил документацию по Realm и разбираюсь в различных классах, которые можно использовать для управления группами объектов. Из того, что я понимаю, есть RLMArrays, RLMLinkingObjects и RLMResults. Я буду использовать пример класса Blog со многими объектами класса Comments для настройки моего вопроса. Предполагая, что класс Blog может иметь 10000 объектов, а каждый объект Blog может иметь 1000 комментариев, мне не ясно, как лучше выразить отношения в Realm. Я мог бы использовать RLMArray комментариев как свойство для блога. Тогда мне придется управлять обратной связью блогов и комментариев. Это приводит меня к объектам RLMLinkingObjects, поскольку я могу выразить свойство комментариев в блоге как любые комментарии, которые ссылаются на блог. Затем возникает сложность, заключающаяся в том, что блогов и комментариев гораздо больше, чем я хотел бы создать сразу. Именно здесь опция RLMResults является привлекательной, поскольку она позволяет лениво создавать объекты. Однако это меняет природу того, как я взаимодействую с объектами, поскольку теперь я буду запрашивать комментарии, связанные с блогом, а не просто обращаться к свойству (например, blog.comments).

Здесь я упустил из виду, что все эти данные находятся на сервере, но я надеюсь сначала определить объектную модель локально (с постоянством), а затем выяснить, как сопоставить модель через REST с сервером.,

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

Спасибо!

1 ответ

Решение

Ага! Вы на правильном пути. Blog объект может иметь несколько Comment объекты, назначенные ему, поэтому целесообразно использовать RLMArray недвижимость в Blog управлять всеми своими комментариями. Вы можете использовать RLMLinkingObjects чтобы проверить какие Blog возражать против Comment принадлежит.

@interface Comment : RLMObject
@property (readonly) RLMLinkingObjects *blog;
@property NSString *message;
@end

@implementation Comment
+ (NSDictionary *)linkingObjectsProperties {
    return @{
        @"blog": [RLMPropertyDescriptor descriptorWithClass:Blog.class propertyName:@"comments"],
    };
}
@end
RLM_ARRAY_TYPE(Comment)

@interface Blog : RLMObject
@property RLMArray<Comment *><Comment> *comments;
@end

@implementation Blog
@end

RLMArray ведет себя так же, как RLMResults; это лениво загружает данные и является живой ссылкой на базовый контент. Так что вы можете легко положиться на RLMArray в этом случае без каких-либо забот.:)

Хотя официальных решений не существует, существует множество сторонних библиотек, которые помогают отображать данные JSON из API-интерфейсов REST в Realm (например, https://github.com/matthewcheok/Realm-JSON), поэтому их стоит проверить. их. В любом случае, если схема локально и удаленно относительно похожа, вы сможете отобразить ее без особых проблем.

Я надеюсь, что это помогло!

Другие вопросы по тегам