2014-10-07 6 views
1

Привет я делаю проект с Realm, и теперь с новой версией этого я получаю «Объект уже сохраняется в Realm»Объект уже сохраняется в Realm

Это происходит потому, что я пытаясь сохранить объект, который уже существует в другой сфере. (Это заключение, которое я получил после прочтения документации)

Но на самом деле у меня только одно королевство, по умолчанию.

Для каждого добавления или обновления do 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

+0

убедитесь, что вы используете правильный класс при вызове objectForPrimaryKey: (я ошибочно использовал суперкласс) –

0

Вы по крайней мере забыли добавить [realm commitWriteTransaction] в конец.

+0

Я забыл положи сюда. Но в моем коде у меня есть – GoNinja