2016-02-22 66 views
2

更新我有從後端一個對象作爲這樣對象被替換,而不是在境界目標C

dummyObj{ name, number, image and id }

我已在RLMObject模型另一個布爾屬性稱爲isFav加入。我在我的模型上調用了方法primaryKey,並將id設置爲主鍵。

問題是我每次更新我的對象時,isFav屬性被替換爲0,它的舊值不會保持不變。

我已經在另一個應用程序中實際使用過這個場景,並且它正常工作,唯一的例外是我使用的是較早的領域版本。

目前我使用的具體方法是:

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

mj_objectWithKeyValues是MJExtension庫JSON模型映射。

我也試過[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": [ ] }

+0

您可以分享您的'DummyObj'類的聲明,以及您傳遞給'+ mj_objectWithKeyValues:'的'jsonDic'的確切內容嗎? – bdash

+0

@bdash我添加了確切的內容。 :) –

回答

3

簡短的回答是那部分更新通過將RLMObject子類的實例傳遞給+createOrUpdateInDefaultRealmWithValue:不能執行對象。原因是無法代表不要更新此屬性您的RLMObject子類中的某個屬性。您將想要將字典傳遞到+ createOrUpdateInDefaultRealmWithValue:,其中缺少給定密鑰代表不會更新此屬性

要在此進一步擴大,你的代碼執行的更新是:

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

這要求具有相同的主鍵值爲testObj現有的對象進行更新,因此其所有屬性都具有相同的值爲testObjtestObjisFav屬性等於NO,所以現有對象更新爲isFav = NO

那麼爲什麼testObj.isFav == NO?因爲+mj_objectWithKeyValues:返回DummyObj的實例,並且DummyObjisFav屬性必須具有值。如果isFav出現在您傳遞給+mj_objectWithKeyValues:的字典中,則它返回的實例將具有該值。如果字典中不存在值(例如您提供的樣本數據中的isFav),則實例變量將不會被明確初始化並保持其默認分配狀態(例如零)。

+0

非常感謝@bdash。我不能相信我會因爲這樣一個錯誤而墮落,即使你剛開始通過字典,然後在這個過程中我改變了它。再次感謝。 :) –