在 Core Data 中获取多个 objectID?

Posted

技术标签:

【中文标题】在 Core Data 中获取多个 objectID?【英文标题】:Fetching multiple objectIDs in Core Data? 【发布时间】:2020-07-28 16:45:57 【问题描述】:

获取核心数据对象后,我需要稍后重新获取同一组对象。我知道所有 ID,但对象可能会更改,因此需要再次获取objectID一次性。如何实现?

PS:我不能只使用与第一次获取相同的谓词,因为可以添加新对象,我不需要它们。

【问题讨论】:

我不知道为什么人们投票关闭。这个问题是明确而具体的。 您可以通过 objectID 从托管对象上下文中获取对象,而无需 fetching 对象。 Mapping 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 上一次获取多个实体?

如何使用 Core Data 中多个实体的属性获取属性值?

查询Core Data中多个子实体类型的所有对象

Core Data 获取关系对象

使用谓词在 Core Data 中获取父母的所有孩子

如何根据来自多个 Core Data 属性的计算值进行排序