我有一个Web服务调用,它返回我转换为域对象的XML,然后我想将这些域对象插入到我的Core Data存储中。
但是,我真的想确保我不插入重复项(对象有一个日期戳,使它们唯一,我希望用于唯一性检查)。我真的不想循环遍历每个对象,进行提取,然后插入,如果没有找到任何东西,那将是非常差的性能......
我想知道是否有更简单的方法吗?也许是我的对象在记忆中的“分组”????这可能吗?
答案 0 :(得分:5)
你的问题已经有答案了。你需要循环遍历它们,寻找它们,如果它们存在更新;否则插入。没有其他办法。
由于您没有使用单个值,因此您可以通过设置谓词来一次获取所有相关对象:
[myFetchRequest setPredicate:[NSPredicate predicateWithFormat:@"timestamp in %@", myArrayOfIncomingTimestamps]];
这将为您提供已存在故障状态的所有对象。然后,您可以针对该数组运行内存谓词,以检索现有对象以更新它们。
另外,提出建议。时间戳是非常独特的ID。我会高度建议你重新考虑一下。
答案 1 :(得分:1)
时间戳不是唯一的。但是,我们假设您有唯一的ID(例如UUID / GUID /无论如何)。
在普通的SQL-land中,您需要在GUID上添加索引并进行搜索,或添加唯一性约束,然后尝试插入(如果插入失败,请执行更新)或进行更新(和如果更新失败,请执行插入操作,如果插入失败,请执行另一次更新...)。请注意,许多数据库中的默认事务在此处不起作用 - 它们会锁定行,但您无法锁定尚不存在的行。
答案 2 :(得分:0)
你怎么知道记录是重复的?你有主键还是其他一些独特的键? (你应该。)检查该密钥 - 如果它已存在于商店的实体中,则更新它,否则插入它。