2014-10-07 152 views
1

嗨,我是在做與境界的一個項目,而現在它的新版本,我不斷收到對象已經堅持了一個域

「對象已經在領域堅持」這是因爲我試圖保存已經存在的對象在不同的​​領域。 (這是我閱讀文檔後得出的結論)

但實際上我只有一個Realm,默認的一個。

對於每個添加或更新做領域,我創建一個線程。並在該線程上,我有:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    RLMRealm *realm = [RLMRealm defaultRealm]; 
    [realm beginWriteTransaction]; 

    NSString *PlaceId = [placeInfoDic objectForKey:@"PlaceId"]; 
    RLMArray *placeArr = [Place objectsWhere:@"PlaceId = %@",PlaceId]; 

    Place *place; 

    if (placeArr.count > 0) { 
     place = [placeArr objectAtIndex:0]; 
    } 
    else { 
     place = [[Place alloc] init]; 
     place.PlaceId = PlaceId; 
    } 

    [realm addOrUpdateObject:place]; 
    [realm commitWriteTransaction]; 
}); 

和PlaceId是我的模型上的主鍵。

Thx提前!

回答

5

addOrUpdateObject:應該實際上應該被命名爲addOrReplaceObject:。如果沒有具有相同主鍵的對象已經存在,它將接受一個完全初始化的對象並插入它,或者如果它存在,則替換現有的對象。在現有對象上調用它是不必要的,因爲Realm不需要明確通知您在寫事務中更改的每個對象。你可能需要做以下的事情之一:如果你需要的,如果它存在閱讀Place對象的當前屬性

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    RLMRealm *realm = [RLMRealm defaultRealm]; 
    [realm beginWriteTransaction]; 

    NSString *PlaceId = [placeInfoDic objectForKey:@"PlaceId"]; 
    Place *place = [Place objectForPrimaryKey:PlaceId]; 
    if (!place) { 
     place = [[Place alloc] init]; 
     place.PlaceId = PlaceId; 
     [realm addObject:place]; 
    } 

    // Set other properties on Place 

    [realm commitWriteTransaction]; 
}); 

如果不是:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    RLMRealm *realm = [RLMRealm defaultRealm]; 
    [realm beginWriteTransaction]; 

    NSString *PlaceId = [placeInfoDic objectForKey:@"PlaceId"]; 
    Place *place = [[Place alloc] init]; 
    place.PlaceId = PlaceId; 
    // Set other properties on Place 

    [realm addOrUpdateObject:place]; 

    [realm commitWriteTransaction]; 
}); 
+0

Thx解決了問題 – GoNinja 2014-10-07 20:08:03

+0

驗證您在調用objectForPrimaryKey時使用了正確的類:(我錯誤地使用了超類) – 2014-12-01 10:46:05

0

你至少忘了在最後加上[realm commitWriteTransaction]。

+0

我忘了放在這裏。但在我的代碼中,我有 – GoNinja 2014-10-07 11:23:40