如何避免在核心数据中使用唯一键重复插入?
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_SERIAL
对find-insert-save
进行一一操作来避免这个问题。但是我想知道是否还有其他方法可以做到这一点,例如主键?是的,我知道 Core Data 不是数据库,而是对象图。
谢谢。
【问题讨论】:
【参考方案1】:杰森·李,
我通过在后台队列中执行所有插入并捕获 -didSave 通知以开始在 UI 中显示项目来解决此问题。这保证了在创建项目时对项目的单一访问。之后,始终允许针对已知唯一 ID 进行多线程访问。
安德鲁
【讨论】:
以上是关于如何避免在核心数据中使用唯一键重复插入?的主要内容,如果未能解决你的问题,请参考以下文章
#导入Word文档图片#值得收藏:当向数据库导入大量数据时,mysql主键唯一键重复插入,如何丝滑操作并不导入重复数据呢