在Realm中实现一对多关系的正确方法

时间:2016-05-12 20:27:24

标签: realm realm-cocoa

我研究过Realm的文档,并了解可用于管理对象组的各种类。据我所知,有RLMArrays,RLMLinkingObjects和RLMResults。我将使用具有许多类注释对象的Blog类的示例来设置我的问题。假设Blog类可以有10000个对象,并且每个Blog对象可以有1000个注释,那么我不清楚如何最好地表达Realm中的关系。我可以使用RLMArray的评论作为博客的属性。然后我将不得不管理博客和评论的反向链接。这导致我转向RLMLinkingObjects,因为我可以将博客上的comments属性表示为链接回博客的任何评论。然后有一个复杂的问题是,我想要一次实例化的博客和评论要多得多。这是RLMResults选项很有吸引力的地方,因为它允许对象懒惰地实例化。但是,这改变了我与对象交互的性质,因为我现在正在查询与博客相关的评论,而不是简单地访问该属性(例如blog.comments)。

我在这里遗漏了一个重要的考虑因素,即这些数据都存在于服务器上,但我希望首先在本地定义对象模型(使用持久性),然后弄清楚如何映射REST上的模型到服务器。

我喜欢Realm用户的任何意见,想法或建议。

谢谢!

1 个答案:

答案 0 :(得分:0)

是的!你走在正确的轨道上。 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而无需担心。 :)

虽然没有任何官方解决方案,但是有很多第三方库可以帮助将REST API中的JSON数据映射到Realm(例如https://github.com/matthewcheok/Realm-JSON),因此可能值得检查它们。无论哪种方式,只要本地和远程架构相对类似,您应该能够毫不费力地映射它。

我希望有所帮助!