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

Proper way to implement one-to-many relationship in Realm

我研究了 Realm 的文档并理解了可用于管理对象组的各种 classes。据我了解,有 RLMArrays、RLMLinkingObjects 和 RLMResults。我将使用包含许多 class 评论对象的博客 class 示例来设置我的问题。假设 Blog class 可以有 10000 个对象,每个 Blog 对象可以有 1000 个 Comments,我不清楚如何最好地表达 Realm 中的关系。我可以使用 RLMArray 评论作为博客的 属性。然后我将不得不管理博客和评论的反向 linkage。这让我想到了 RLMLinkingObjects,因为我可以将博客上的评论 属性 表达为 link 返回博客的任何评论。还有一个复杂的问题是,博客和评论比我想一次实例化的要多得多。这就是 RLMResults 选项很有吸引力的地方,因为它允许延迟实例化对象。然而,这改变了我与对象交互方式的性质,因为我现在将查询与博客相关的评论,而不是简单地访问 属性(例如 blog.comments)。

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

我希望收到来自 Realm 用户的任何意见、想法或建议。

谢谢!

是的!你在正确的轨道上。一个 Blog 对象可以分配给多个 Comment 对象,因此在 Blog 中使用 RLMArray 属性 来管理其所有评论是合适的。然后,您可以使用 RLMLinkingObjects 检查特定 Comment 属于哪个 Blog 对象。

@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),因此它可能值得检查出来。无论哪种方式,只要本地和远程的架构相对相似,您就可以毫不费力地映射它。

希望对您有所帮助!