对象已经存在于Realm中

时间:2014-10-07 08:42:11

标签: objective-c realm

您好我正在与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!

2 个答案:

答案 0 :(得分: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];
});

答案 1 :(得分:0)

您至少忘记在最后添加[realm commitWriteTransaction]。