替换对象而不是在Realm中更新目标C

时间:2016-02-22 06:35:54

标签: objective-c realm

我有一个来自后端的对象

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": [ ] }

1 个答案:

答案 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的情况一样,实例变量将不会被显式初始化并保持其默认分配状态(例如,零)