在 Core Data 中获取多个 objectID?
Posted
技术标签:
【中文标题】在 Core Data 中获取多个 objectID?【英文标题】:Fetching multiple objectIDs in Core Data? 【发布时间】:2020-07-28 16:45:57 【问题描述】:获取核心数据对象后,我需要稍后重新获取同一组对象。我知道所有 ID,但对象可能会更改,因此需要再次获取objectID,一次性。如何实现?
PS:我不能只使用与第一次获取相同的谓词,因为可以添加新对象,我不需要它们。
【问题讨论】:
我不知道为什么人们投票关闭。这个问题是明确而具体的。 您可以通过 objectID 从托管对象上下文中获取对象,而无需fetch
ing 对象。 Map
ping objectID 到对象可能比应用谓词更有效。
Vadian,不确定我是否理解您的不带 fetch 的映射解决方案。
【参考方案1】:
如果您有一个对象 ID 数组,您可以使用正确的谓词一次获取这些 ID 的所有对象。会是这样的
let objectIDs: [NSManagedObjectID] = // Your object IDs from a previous fetch
let predicate = NSPredicate(format: "self in %@", objectIDs)
然后在 fetch 中使用该谓词。
该谓词表示要获取数组中具有对象 ID 的每个对象。不会包含相同类型的较新对象。
附加:@vadian 提到的“映射”方法是这样的,其中MyClass
是您的托管对象类的名称:
let results: [MyClass] = objectIDs.compactMap try? context.existingObject(with: $0) as? MyClass
使用此代码,您需要使用existingObject(with:)
而不是object(with:)
,因为您提到您可能已经删除了一些对象。在这种情况下使用 object(with:)
可能会得到一些虚假的结果,因为该函数总是返回一个托管对象,即使没有具有对象 ID 的对象。
如果您只有几个对象 ID,则每种方法的性能可能非常相似。对于更大的集合,我怀疑compactMap
会更慢,因为它需要单独询问每个对象的上下文。谓词方法一次要求所有内容,并让 SQLite 处理查找。不过我不确定这个比较,所以可能出于某种原因它是相反的。
【讨论】:
谢谢汤姆。如果可行,我会检查并接受您的回答!你完全理解我的需要。一个问题。如果删除了这些对象中的任何一个,它会导致致命错误还是只是跳过删除的对象? 删除了一些对象也没关系。您将获得与数组中的 ID 匹配的任何对象。如果某些 ID 不再有效,它们将被忽略。 @bodich 我在问题的评论中添加了“地图”方法。以上是关于在 Core Data 中获取多个 objectID?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中使用 UISearchBar 和 NSFetchedResultsController 在 Core Data 上一次获取多个实体?