如何避免插入重复记录?

时间:2010-08-19 23:00:01

标签: ios objective-c core-data

我有一个Web服务调用,它返回我转换为域对象的XML,然后我想将这些域对象插入到我的Core Data存储中。

但是,我真的想确保我不插入重复项(对象有一个日期戳,使它们唯一,我希望用于唯一性检查)。我真的不想循环遍历每个对象,进行提取,然后插入,如果没有找到任何东西,那将是非常差的性能......

我想知道是否有更简单的方法吗?也许是我的对象在记忆中的“分组”????这可能吗?

3 个答案:

答案 0 :(得分:5)

你的问题已经有答案了。你需要循环遍历它们,寻找它们,如果它们存在更新;否则插入。没有其他办法。

由于您没有使用单个值,因此您可以通过设置谓词来一次获取所有相关对象:

[myFetchRequest setPredicate:[NSPredicate predicateWithFormat:@"timestamp in %@", myArrayOfIncomingTimestamps]];

这将为您提供已存在故障状态的所有对象。然后,您可以针对该数组运行内存谓词,以检索现有对象以更新它们。

另外,提出建议。时间戳是非常独特的ID。我会高度建议你重新考虑一下。

答案 1 :(得分:1)

时间戳不是唯一的。但是,我们假设您有唯一的ID(例如UUID / GUID /无论如何)。

在普通的SQL-land中,您需要在GUID上添加索引并进行搜索,或添​​加唯一性约束,然后尝试插入(如果插入失败,请执行更新)或进行更新(和如果更新失败,请执行插入操作,如果插入失败,请执行另一次更新...)。请注意,许多数据库中的默认事务在此处不起作用 - 它们会锁定行,但您无法锁定尚不存在的行。

答案 2 :(得分:0)

你怎么知道记录是重复的?你有主键还是其他一些独特的键? (你应该。)检查该密钥 - 如果它已存在于商店的实体中,则更新它,否则插入它。