我有一个来自后端的对象
dummyObj{ name, number, image and id }
我在RLMObject模型上添加了另一个名为isFav
的bool属性。我在模型上调用了方法primaryKey
,并将id
设置为主键。
问题在于每次更新对象时,isFav
属性都会替换为0,并且旧值不会保持不变。
我之前在另一个应用程序中实际使用过这个场景,并且它工作得很好,唯一的例外是我使用的是较旧的域版本。
目前我正在使用的确切方法是:
DummyObj *testObj = [DummyObj mj_objectWithKeyValues:jsonDic];
[DummyObj createOrUpdateInDefaultRealmWithValue:testObj];
mj_objectWithKeyValues
是用于json模型映射的MJExtension库。
我也试过[realm addOrUpdateObject: testObj];
我已经在我的模型上实现了方法defaultPropertyValues
,并为isFav
属性设置了一个默认值,后来我将它们全部一起删除,但仍然替换了对象而不是更新标识。
并从文档中
请注意,更新对象时,
NSNull
仍被视为可选属性的有效值。如果您提供具有NSNull
属性值的字典,则这些属性将应用于您的对象,并且这些属性将被清空。为确保您不会遇到任何计划外数据丢失,请确保在使用此方法时仅提供您要更新的属性。
但实际上我只提供我想要更新的属性,但它会更新isFav
属性。
dummyObj的确切类是
#import <Foundation/Foundation.h>
#import <Realm/Realm.h>
#import "Tags.h"
#import "BusinessCategory.h"
#import <MJExtension/MJExtension.h>
RLM_ARRAY_TYPE(Tags)
RLM_ARRAY_TYPE(BusinessCategory)
@interface HotlineNumber : RLMObject
@property NSString *hotlineName;
@property NSString *hotlineNumber;
@property NSString *hotlineImage;
@property NSInteger hotlineID;
@property BOOL isFav;
@property RLMArray<BusinessCategory> *categories;
@property RLMArray<Tags> *hotlineTags;
@end
我的实施文件是:
#import "HotlineNumber.h"
@implementation HotlineNumber
//
//+ (NSDictionary *) defaultPropertyValues{
//
// NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
// dict[@"isFav"] = @NO;
//
// return dict;
//}
+ (NSString *) primaryKey {
return @"hotlineID";
}
+ (NSDictionary *) mj_objectClassInArray{
return @{
@"categories" : @"BusinessCategory",
@"hotlineTags": @"Tags"
};
}
@end
和我的jsonDict如下
{
"hotlineID": 241,
"hotlineName": "Abaza Auto Trade",
"hotlineNumber": "16876",
"hotlineImage": "",
"categories": [
{
"catId": 92,
"catName": "Automotive",
"catIcon": "",
"catColor": "#03a9f4",
"catOrder": "",
"isParent": "false"
}
],
"hotlineTags": [ ]
}
答案 0 :(得分:3)
简短的回答是,通过将RLMObject
子类的实例传递给+createOrUpdateInDefaultRealmWithValue:
,无法执行对象的部分更新。这样做的原因是,无法为RLMObject
子类上的属性表示不更新此属性。您反而希望将字典传递给+ createOrUpdateInDefaultRealmWithValue:
,其中缺少给定密钥表示不更新此属性。
为了进一步扩展,执行更新的代码是:
DummyObj *testObj = [DummyObj mj_objectWithKeyValues:jsonDic];
[DummyObj createOrUpdateInDefaultRealmWithValue:testObj];
这要求更新与testObj
具有相同主键值的现有对象,以使其所有属性与testObj
具有相同的值。 testObj
isFav
属性等于NO
,因此现有对象已更新为isFav = NO
。
那么为什么testObj.isFav == NO
?由于+mj_objectWithKeyValues:
会返回DummyObj
的实例,因此DummyObj
&n; isFav
属性必须具有值。如果您传递给isFav
的字典中存在+mj_objectWithKeyValues:
,则它返回的实例将具有该值。如果字典中没有值,就像您提供的示例数据中isFav
的情况一样,实例变量将不会被显式初始化并保持其默认分配状态(例如,零)