领域模型中的递归关系

时间:2016-05-17 09:09:23

标签: ios objective-c recursion realm relationships

如果我希望拥有相同用户模型的Realm数组,则会发生异常。  RLMException(@"RLMArray properties require a protocol defining the contained type - example: RLMArray<Person>."); 那么有一个解决方法吗?如何在Realm中实现递归关系如下?

#import <Realm/Realm.h>
@interface User : RLMObject
@property NSInteger userId;
@property NSString *displayName;
@property RLMArray<User> *friends;
- (instancetype)initWithDictionary:(NSDictionary *)data;
@end  
RLM_ARRAY_TYPE (User)

2 个答案:

答案 0 :(得分:2)

如异常所示,您需要声明一个协议来定义RLMArray的包含类型。这就是RLM_ARRAY_TYPE宏的作用。这里的特殊之处在于您需要在接口声明之前放置此声明,这可以通过使用User预先声明@class类型来完成。你可以这样做:

#import <Realm/Realm.h>

@class User;
RLM_ARRAY_TYPE (User)

@interface User : RLMObject
@property NSInteger userId;
@property NSString *displayName;
@property RLMArray<User> *friends;
- (instancetype)initWithDictionary:(NSDictionary *)data;
@end

答案 1 :(得分:1)

我认为术语是&#34;反向关系&#34; ,我从未尝试使用同一类的嵌套对象进行引用和对象。 但在Realm纪录片中,他们有一个例子和&#34; dog&#34;和&#34;所有者&#34;。 主人可以养狗,狗可以拥有主人,他们有&#34;反向关系&#34;

它应该是这样的:

@interface Dog : RLMObject
@property NSString *name;
@property NSInteger age;
@property (readonly) RLMLinkingObjects *owners;
@end

@implementation Dog
+ (NSDictionary *)linkingObjectsProperties {
    return @{
        @"owners": [RLMPropertyDescriptor descriptorWithClass:Person.class propertyName:@"dogs"],
    };
}
@end

参考:https://realm.io/docs/objc/latest/#relationships