获取“最新”单个实体的最简单 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请求中的实体名称错误,如何避免崩溃?