获取“最新”单个实体的最简单 Fetch 请求 - 核心数据

Posted

技术标签:

【中文标题】获取“最新”单个实体的最简单 Fetch 请求 - 核心数据【英文标题】:Easiest Fetch request for getting just the 'latest' Single entity - core data 【发布时间】:2012-05-12 14:13:47 【问题描述】:

我有一个父 <-->> 子关系(对多)。 关系是当我需要获取所有孩子时,Parent.children = (NSSet *) child(s)

有时我只需要基于子实体的 timeStamp 属性的一个最新的实体。

我正在寻找最简单的获取方法,这比创建获取请求并设置获取限制 One 并使用排序描述符根据时间戳对其进行排序要容易。

有没有更简单的方法?只是打电话吧:

[Parent.children firstObject];

原因是我需要在应用程序的整个生命周期中多次获取它。在某些情况下,我虽然必须在 -(void)awakeFromFetch() of a Parent Entity.. 中获取最新的子实体,这就是为什么我想要一种比其他任何方法都更容易的方法,特别是在内存方面。


当获取子实体时,我有点使用这个谓词获取一堆它们是 2 个或更多父实体的子实体:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"forParent IN %@", [Array of Parents]];

从生成的 NSSet 中,因为我会为所述对象获取所有必需的子实体,如果我可以根据它的 latest child 分配一个指针将非常方便strong>timeStamp 属性(NSDate)。

显然,在我得到 NSSet 结果之后,我可以遍历每个子节点并分配一个指向我在 NSSet 中找到的最新实体的指针,但它看起来相当费力,尽管我必须只分配一个指向特定 Parent 的最新实体,迭代一个可能有一百多个实体的 NSSet 似乎 bad programming

有什么想法吗?

【问题讨论】:

我用max:函数解决了类似的问题NSExpression,而不是限制1和排序。其他解决方案是在父实体的模型中创建一个 latestChild 属性,并在创建每个新子实体时设置它。这并不理想,但很有效,而且是最快的解决方案。 你能详细说明一下吗?我不太明白“在父实体上创建模型” 让我解释一下 :) 你有两个实体——父母和孩子。将名为 latestChild 的新属性添加到模型中的父实体(由 xcode 定义的 MOM),并将此 latestChild 设置为最近添加到 Parent.childrens 的子项。所以,最后 latestChild 是与 Child 的直接关系,而不是通过谓词或迭代计算的关系。 ups...不是妈妈,而是 xcdatamodel :) @thom_ek 我正是这样做的 :) 我没有添加属性,而是在父子之间添加了另一个一对一关系,称为 latestChild,无论如何,我必须迭代 throw other子实体,如果我达到数组的最后一个索引计数,我只需将其添加到单个 latestChild 关系中。 【参考方案1】:

您有多种选择。 fetchLimit = 1,按时间排序的获取请求实际上不是一个坏选择。您甚至可以在模型 GUI 中将时间戳字段设置为 INDEX,查找速度会非常快。

如果数据库会不断变化,并且您总是希望访问最新的项目,请考虑在 NSManagedObjectContext 上注册 DidSave 通知。

您可以在保存上下文时调用(甚至在任何对象发生更改时)。在通知方法中,只需查看插入的项目,并更新为最新的值。

您可以搜索插入的对象,并抓取具有最大时间戳的匹配实体。

保存和对象更改的通知是:

NSManagedObjectContextDidSaveNotification NSManagedObjectContextObjectsDidChangeNotification

【讨论】:

以上是关于获取“最新”单个实体的最简单 Fetch 请求 - 核心数据的主要内容,如果未能解决你的问题,请参考以下文章

如果Core Data count / fetch请求中的实体名称错误,如何避免崩溃?

OData 带更新的实例,并能取得元数据格式类型

Java - 从列表/数组中的每个对象获取单个属性的最简单方法?

提高 Javascript 中多个 FETCH 请求的性能

React Native之Fetch简单封装获取网络状态

如何在 Backbone 中获取单个模型?