Realm.io - 如何在使用服务器的响应数据时使用defaultPropertyValues?

时间:2015-04-18 13:47:42

标签: ios objective-c realm

我知道我们必须使用defaultPropertyValues。 班级结构:

@interface Event : RLMObject
@property (nonatomic, copy) NSString *roomName;
....
- (instancetype)initWithAttributes:(NSDictionary *)attributes;

@end

@implementation Event

+ (NSDictionary *)defaultPropertyValues {
    return @{@"roomName" : @""};
}

- (instancetype)initWithAttributes:(NSDictionary *)attributes {
    self = [super init];
    if (self) {
        self.roomName = [attributes valueForKeyPath:@"room"];
        .......
    }
    return self;
}

...

Event *school = [[IVEvent alloc] initWithAttributes:dict];
[realm addObject:school];

' RLMException',原因:'没有为属性' roomName'指定值或默认值在'事件'

这是因为roomName是通过defaultPropertyValues类方法分配的。但是一旦从属性字典中解析出来,则roomName变为nil并且崩溃。有没有更好的方法来处理这个?我不想把条件放在[属性valueForKeyPath:@" room"]

1 个答案:

答案 0 :(得分:2)

您可以在实体类(Event)上使用Realm的内置方法createOrUpdateInRealm:withObject:而不是自定义初始化程序,将NSDictionaries映射到RLMObjects。如文档所述,这将在没有给出值时回退使用默认值:

  

用于填充对象的对象。这可以是任何符合键/值编码的对象,也可以是JSON对象,例如返回的对象   NSJSONSerialization中的方法,或者带有一个对象的NSArray   每个持久的财产。如果需要,将抛出异常   属性不存在且未设置默认值。

否则,您需要在自定义初始化程序中确保不使用nil值覆盖属性。如果您有一个自定义映射,其中属性名称不同,并且您的服务器响应是JSON格式,那么像Realm-JSON这样的对象映射库对您来说可能很有趣。