2016-05-12 150 views
0

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

我在这里忽略了一个重要的考虑因素,那就是这些数据都驻留在服务器上,但我希望先定义对象模型(使用持久性),然后找出如何映射模型REST到服务器。

我喜欢来自Realm用户的任何输入,想法或建议。

谢谢!

回答

0

是的!你在正确的轨道上。 A Blog对象可能有多个分配给它的Comment对象,因此可以使用Blog中的RLMArray属性来管理其所有注释。然后可以使用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数据从REST API映射到Realm(例如https://github.com/matthewcheok/Realm-JSON),因此可能值得将其检出。无论哪种方式,只要本地和远程的模式相对相似,您应该能够映射它,而不会有太多麻烦。

我希望有帮助!

+0

这是非常有用的...很高兴知道RLMArray被延迟加载。这使得一个一致的模型。有什么方法可以在数组访问或对象属性中检测“错误”吗?理想情况下,我想在本地不可用的情况下从网络中获取数据。 – edward