我需要从coredata获取最新日期
我找到了一种方法
NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
[fetchRequest setFetchLimit:1];
按日期排序,然后选择第一个
然而,这可不是更优化吗?这种方法看起来像是一种蛮力
sort是nlogn,但是对max的简单搜索是n
答案 0 :(得分:9)
您实际上可以向SQL询问该值,而不是具有该值的对象:
NSExpression *date = [NSExpression expressionForKeyPath:@"date"];
NSExpression *maxDate = [NSExpression expressionForFunction:@"max:"
arguments:[NSArray arrayWithObject:maxDate]];
NSExpressionDescription *d = [[[NSExpressionDescription alloc] init] autorelease];
[d setName:@"maxDate"];
[d setExpression:maxSalaryExpression];
[d setExpressionResultType:NSDateAttributeType];
[request setPropertiesToFetch:[NSArray arrayWithObject:d]];
NSError *error = nil;
NSArray *objects = [managedObjectContext executeFetchRequest:request error:&error];
if (objects == nil) {
// Handle the error.
} else {
if (0 < [objects count]) {
NSLog(@"Maximum date: %@", [[objects objectAtIndex:0] valueForKey:@"maxDate"]);
}
}
在获取托管对象 - &gt;下更详细地描述了这一点。 CoreData文档中的获取特定值。
答案 1 :(得分:1)
第2行maxDate表达式引用自身(maxDate)。 我认为这必须是第一行的“日期”变量。
答案 2 :(得分:0)
我猜这几乎是最好的方式。我不确定是否有一种更有效的方法,因为它必须比较每个日期以确定最老的日期。 以下是其他两种方式:
1)您可以将BOOL用作托管对象的属性。 (比如年龄= 1) 但是,每次删除一个对象时,都必须找到一个新的“最旧”的托管对象。
2)您可以保存最旧的一个,直到它发生变化。如果您必须经常找到最旧的托管对象,这可能会节省大量工作。
这取决于您的应用程序(插入/删除托管对象的次数以及您需要最旧对象的次数)。