最简单的获取请求只获取最新的'单一实体 - 核心数据

时间:2012-05-12 14:13:48

标签: objective-c core-data nsfetchrequest

我有一个父<-->>子关系(to-many)。 这种关系是我需要获取所有孩子的时候,Parent.children = (NSSet *) child(s)

有些时候我只需要基于Child实体的timeStamp属性的一个,最新的实体。

我正在徘徊最简单的获取方式,比创建获取请求和设置获取限制一更简单,并使用排序描述符根据timeStamp对其进行排序。

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

[Parent.children firstObject];

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


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

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

从结果NSSet中,因为我将获得所述对象的所有必需的Child实体,如果我可以根据<最新子项分配指针,那将非常方便strong> timeStamp 属性(NSDate)。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

NSManagedObjectContextDidSaveNotification NSManagedObjectContextObjectsDidChangeNotification