【问题标题】:Object is already persisted in a Realm对象已经被持久化在一个领域中
【发布时间】:2014-10-07 08:42:11
【问题描述】:

您好,我正在使用 Realm 做一个项目,现在使用它的新版本,我不断收到“对象已在 Realm 中持久化”

发生这种情况是因为我试图保存一个已经存在于不同领域的对象。 (这是我看完文档后得出的结论)

但实际上我只有一个 Realm,默认的。

对于每个 add 或 update do 领域,我正在创建一个线程。在那个线程上我有:

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 是我模型的主键。

提前谢谢!

【问题讨论】:

    标签: objective-c realm


    【解决方案1】:

    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];
    });
    

    【讨论】:

    • 验证调用objectForPrimaryKey时是否使用了正确的类:(我误用了超类)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      相关资源
      最近更新 更多