获取CoreData中对象的最小日期

时间:2011-09-02 01:25:30

标签: objective-c core-data nsdate fetching-strategy

我遇到与this question相同的问题,但@davedelong的答案对我不起作用。

当关注Apple Example时,为了获取一组对象中的最小日期,我得到以下错误

-[NSDate count]: unrecognized selector sent to instance

我的理解是NSExpression的最大值:仅支持NSArray。所以我需要另一个解决方案。

@davedelong建议使用升序NSSortDescriptor,所以我做了:

NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init];
fetchRequest.entity = [NSEntityDescription entityForName:NSStringFromClass([GCSession class])
                                  inManagedObjectContext:self.objectContext];
fetchRequest.fetchLimit = 1;

NSSortDescriptor* sort = [[NSSortDescriptor alloc] initWithKey:@"startDate" ascending:YES];
fetchRequest.sortDescriptors = [NSArray arrayWithObject:sort];

GCSession* session = [[self.objectContext executeFetchRequest:fetchRequest error:nil] lastObject];

return session.startDate;

这里的问题是从fetch返回的session对象似乎不是具有最小startDate的对象。在我的测试中,似乎它甚至返回了最新的日期,但似乎并不一致。

我还可以获取每个GCSession对象并对它们进行排序,但这似乎有些过分,尤其是当用户使用该应用程序时,GCSession将会增加数量。

编辑A test project,演示Apple示例代码中的错误。

1 个答案:

答案 0 :(得分:3)

只有在获取对象后才会发挥作用。你已经设置了一个读取限制,没有谓词告诉提取“去抓取任何随机的单个GCSession对象”。一个fetch有一个数组1元素长,然后对它进行排序,这是无用的。

如果要使用排序来查找最小值或最大值,则必须获取所有对象然后对其进行排序。删除行:

fetchRequest.fetchLimit = 1;

...应该允许代码工作。

但是,您应该能够使用表达式获取最小值和最大值。这是一种基本操作。

编辑:查看注释以获取更多详细信息,但如果将后备存储更改为SQL而不是XML,Apple的示例可以正常工作