我知道我们必须使用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"]
答案 0 :(得分:2)
您可以在实体类(Event
)上使用Realm的内置方法createOrUpdateInRealm:withObject:
而不是自定义初始化程序,将NSDictionaries映射到RLMObjects。如文档所述,这将在没有给出值时回退使用默认值:
用于填充对象的对象。这可以是任何符合键/值编码的对象,也可以是JSON对象,例如返回的对象 NSJSONSerialization中的方法,或者带有一个对象的NSArray 每个持久的财产。如果需要,将抛出异常 属性不存在且未设置默认值。
否则,您需要在自定义初始化程序中确保不使用nil值覆盖属性。如果您有一个自定义映射,其中属性名称不同,并且您的服务器响应是JSON格式,那么像Realm-JSON这样的对象映射库对您来说可能很有趣。