您好我正在与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!答案 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]。