我必须在批处理(导入过程)中在CoreData实体中创建一些数据,我想在结束时“提交”或在错误上“回滚”(因此保存inbetween不起作用)。
问题是我需要创建一个实体“Person”,后来我需要重新使用该实体。但它可以在此过程之前存在,也可以在此导入过程中创建。
所以我试图用谓词“(personId == 4711)”来获取它。但是,尽管我已经确定了
[fetchRequest setIncludesPendingChanges:YES];
它找不到新创建的Person对象。
我读了这个this question和this answer,说明这是不可能的?我是对的吗?
如果是这样,我该如何解决/处理这个问题?
答案 0 :(得分:1)
根据我对CoreData的了解,这是不可能的(如果我错了,请纠正我。)
然而,即使这是可能的,您也绝不想在"每个对象上查询您的商店"基础。
对大型(超过几十个)进口产品的性能影响很大。
我的建议是在导入阶段创建一个由您的唯一标识符键入的字典(从商店现有实体预取,并为那些不存在的实体创建新的字典)。
注意:您应该注意不要在多线程环境中从不同的上下文执行多次插入。在这种情况下,您需要一名协调员来防止重复。
例如:
商店内容:1 - > P1,3-> P3
服务响应:1 - >数据1,2 - > DATA2
算法:
在响应完成时,从响应中获取所有唯一ID - > recievedIds
= @ [1,2]
在创建recievedIds
集期间创建personId的映射/字典 - >数据:
@ {1:Data1,2:Data2}
通过谓词从商店中取货:
[NSPredicate predicateWithFormat:@"personId IN %@",recievedIds]
从结果数组中创建字典
在这种情况下:existingItems
= @ {1:P1}
传递recievedIds
中的所有ID:
1)如果existingItems
中存在id,则更新现有对象
2)否则创建一个新人并将数据插入新记录。
这只会从商店取一次。
你只保存一次。
==>只有2次去商店而不是每个物品旅行