【问题标题】:Object being replaced instead of updating in Realm Objective C对象在 Realm Objective C 中被替换而不是更新
【发布时间】:2016-02-22 06:35:53
【问题描述】:

我有一个来自后端的对象

dummyObj{ name, number, image and id }

我在我的 RLMObject 模型上添加了另一个名为 isFav 的布尔属性。我在我的模型上调用了方法primaryKey,并将id设置为主键。

问题是每次我更新我的对象时,isFav 属性都会被替换为 0,并且它的旧值不会保持不变。

我之前在另一个应用程序中实际使用过这个场景,它运行良好,唯一的例外是我使用的是旧的领域版本。

目前我使用的确切方法是:

  DummyObj *testObj = [DummyObj mj_objectWithKeyValues:jsonDic];
 [DummyObj createOrUpdateInDefaultRealmWithValue:testObj];

mj_objectWithKeyValues 是用于 json 模型映射的 MJExtension 库。

我也试过[realm addOrUpdateObject: testObj];

我还在我的模型上实现了 defaultPropertyValues 方法,并为 isFav 属性设置了默认值,后来我将其全部删除,但对象仍然被替换而不是更新为相同的 id。

并来自文档

请注意,在更新对象时,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": [ ] }

【问题讨论】:

  • 您能否分享您的DummyObj 类的声明,以及您传递给+ mj_objectWithKeyValues:jsonDic 的确切内容?
  • @bdash 我已经添加了确切的内容。 :)

标签: objective-c realm


【解决方案1】:

简短的回答是不能通过将RLMObject 子类的实例传递给+createOrUpdateInDefaultRealmWithValue: 来执行对象的部分更新。这样做的原因是没有办法为您的RLMObject 子类上的属性表示不要更新此属性。您需要将字典传递给+ createOrUpdateInDefaultRealmWithValue:,其中缺少给定键表示不要更新此属性

为了进一步扩展,您执行更新的代码是:

DummyObj *testObj = [DummyObj mj_objectWithKeyValues:jsonDic];
[DummyObj createOrUpdateInDefaultRealmWithValue:testObj];

这要求更新与testObj 具有相同主键值的现有对象,以便其所有属性具有与testObj 相同的值。 testObjisFav 属性等于NO,因此现有对象更新为具有isFav = NO

那么为什么testObj.isFav == NO?因为+mj_objectWithKeyValues:返回一个DummyObj的实例,而DummyObjisFav属性必须有一个值。如果isFav 存在于您传递给+mj_objectWithKeyValues: 的字典中,则它返回的实例将具有该值。如果字典中不存在值,例如您提供的示例数据中的isFav,实例变量将不会被显式初始化,并将保持其默认分配状态(例如,零)。

【讨论】:

  • 非常感谢@bdash。我不敢相信我犯了这样的错误,即使你一开始我也在通过字典,然后在这个过程中不知何故我把它改成了上面的。再次感谢。 :)
猜你喜欢
  • 2019-11-20
  • 1970-01-01
  • 2019-06-02
  • 2021-05-16
  • 2018-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多