1

嗨,我正在用 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 是我模型的主键。

提前谢谢!

4

2 回答 2

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];
});
于 2014-10-07T16:49:51.553 回答
0

您至少忘记在末尾添加 [realm commitWriteTransaction] 。

于 2014-10-07T09:40:22.213 回答