cocoa - Core Data 中线程安全的唯一实体实例

标签 cocoa core-data macos

我有一个具有 messageID 属性的消息实体。我想确保只有一个具有给定 messageID 的 Message 实体实例。在 SQL 中,我只是向 messageID 列添加唯一约束,但我不知道如何使用 Core Data 来执行此操作。我不相信它可以在数据模型本身中完成,那么你该如何去做呢?

我最初的想法是使用验证方法在 NSManagedObject 的上下文中获取 ID,看看它是否找到除自身以外的任何内容,如果是,则验证失败。我怀疑这会起作用 - 但我担心类似的东西的性能。我做了很多努力来最大限度地减少整个导入例程所需的获取请求,并且通过对每个新消息实体执行获取来验证它似乎有点过多。在执行将所有内容导入和连接在一起的实际工作之前,我只需使用两个获取查询即可获取所需的所有预先存在的对象,并识别需要插入到存储中的所有新对象。除了这两个之外,这将为每个更新或插入添加一个提取 - 这似乎消除了我通过首先预处理导入数据而获得的任何性能优势!

这是一个问题的主要原因是导入器可以(可能)在多个线程上同时运行多个批处理,并且可能包含一些重叠/重复的数据,这些数据最终需要在存储中生成一个对象而不是重复的条目。有没有合理的方法来做到这一点,并且我所要求的对核心数据有意义吗?

最佳答案

保证唯一性的唯一方法是进行提取。幸运的是,您可以执行 -countForFetchRequest:error: 并检查它是否为零。这是目前保证唯一性的最便宜的方法。

您可以在验证中完成此操作,或在处理数据的循环中运行它。就我个人而言,我会在创建 NSManagedObject 之上执行此操作,以便在记录已存在时不会进行不必要的分配。

关于cocoa - Core Data 中线程安全的唯一实体实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2181997/

相关文章:

ios - UITableView 使用 NSFetchedResultsController 和 CoreData 意外反弹到 beginUpdates()/endUpdates()/performBatchUpdates()

ios - 核心数据对象注入(inject)(带有依赖项) Storyboard

iphone - 核心数据和iCloud添加预填充的sqlite文件

macos - 是否可以将通过某个端口进入的 ssh 请求转发到另一台机器?

swift - 在 Swift 3 中以编程方式设置内容过滤器

xml - 将 XML 导入 Cocoa 问题

cocoa - NSManagedObjectContext 保存导致 NSTextField 失去焦点

macos - 打开VPN : connect error: Missing External PKI alias

objective-c - NSTableView 中的自动表列标识符

swift - macOS - 如何在 NSTableView 中使用复选框?