如何避免在核心数据中使用唯一键重复插入?

Posted

技术标签:

【中文标题】如何避免在核心数据中使用唯一键重复插入?【英文标题】:HOWTO avoid duplicated insert with unique key in Core Data? 【发布时间】:2013-05-02 03:18:59 【问题描述】:

我知道 Core Data 将 NSManagedObjectId 作为其主键。

现在,在这样的场景中,msgId 对于消息记录来说是唯一的

Thread A 尝试将 msgId 为 1001 的消息插入到上下文中。在插入之前,thread A 已尝试查找键为msgId 和值1001 的消息。没有找到任何东西,所以它执行插入操作。

与此同时,Thread B 正在对 msgId 1001 的消息做同样的事情。

所以,作为时间------------>

Thread A : 查找 --> 插入 --> 保存

Thread B : 查找 --> 插入 --> 保存

线程 A 和线程 B 都有自己的上下文,它们查找、插入和保存,因此 msgId 1001 的消息可能被插入两次并重复保存到磁盘。

也许我可以使用串行队列DISPATCH_QUEUE_SERIALfind-insert-save 进行一一操作来避免这个问题。但是我想知道是否还有其他方法可以做到这一点,例如主键?是的,我知道 Core Data 不是数据库,而是对象图。

谢谢。

【问题讨论】:

【参考方案1】:

杰森·李,

我通过在后台队列中执行所有插入并捕获 -didSave 通知以开始在 UI 中显示项目来解决此问题。这保证了在创建项目时对项目的单一访问。之后,始终允许针对已知唯一 ID 进行多线程访问。

安德鲁

【讨论】:

以上是关于如何避免在核心数据中使用唯一键重复插入?的主要内容,如果未能解决你的问题,请参考以下文章

mysql如何避免主键或者唯一索引重复导致的插入失败问题

如何避免插入重复记录?

MySQL避免插入重复记录的方法

#导入Word文档图片#值得收藏:当向数据库导入大量数据时,mysql主键唯一键重复插入,如何丝滑操作并不导入重复数据呢

java怎么避免向数据库重复插入数据,多台服务器下

检查重复记录 VS 尝试/捕获唯一键约束