【问题标题】:iOS Core Data fetch newly inserted, not yet saved objectsiOS Core Data 获取新插入但尚未保存的对象
【发布时间】:2013-09-18 10:37:27
【问题描述】:

我必须在 CoreData 实体中批量创建一些数据(导入过程),我想在最后“提交”或在错误时“回滚”(因此在中间保存不起作用)。

问题是,例如,我需要创建一个实体“Person”,然后在此过程中我需要重新使用该实体。但它可以在此过程之前已经存在,也可以在此导入过程中创建。

所以我尝试使用谓词“(personId == 4711)”来获取它。但是虽然我已经设置 [fetchRequest setIncludesPendingChanges:YES]; 没有找到新创建的 Person 对象。

我看了this questionthis answer这两个状态,那不可能?我说的对吗?

如果是这样,我该如何解决/处理这个问题?

【问题讨论】:

  • 不知道是不是这样.您需要先刷新上下文。
  • 不,对象是在同一个上下文中创建的。

标签: ios objective-c cocoa core-data


【解决方案1】:

据我对 CoreData 的了解,这确实是不可能的(如果我错了,请纠正我)。

但是,即使可以这样做,您也永远不想基于“每个对象”查询您的商店。
对大型(超过几十个)导入的性能影响是巨大的。

我对您的建议是在导入阶段创建一个由您的唯一标识符键入的字典(从存储现有实体中预取并为不存在的实体创建新实体)。

注意:您应该注意不要在多线程环境中执行来自不同上下文的多次插入。在这种情况下,您需要一名协调员来防止重复。

示例:

存储内容:1 --> P1, 3 --> P3
服务响应:1 --> Data1, 2 --> Data2

算法:
响应完成后,从响应中获取所有唯一 ID --> recievedIds = @[1,2]
在创建recievedIds 期间创建一个personId 的映射/字典 --> 数据:
@{1:数据1,2:数据2}

通过谓词从商店获取:
[NSPredicate predicateWithFormat:@"personId IN %@",recievedIds]
根据结果​​数组创建字典。
在这种情况下:existingItems = @{1 : P1}

传递recievedIds:
中的所有ID 1) 如果 id 存在于existingItems 中,则更新现有对象
2) 否则创建一个新人并将数据插入到新记录中。

这只会从商店中提取一次。
而且您只保存一次。
==> 只去商店 2 次,而不是每个对象的一次旅行

【讨论】:

    猜你喜欢
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    相关资源
    最近更新 更多