CoreData谓词最新存储日期

时间:2011-12-29 12:33:52

标签: cocoa core-data

我需要从coredata获取最新日期

我找到了一种方法

NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];

[fetchRequest setFetchLimit:1];

按日期排序,然后选择第一个

然而,这可不是更优化吗?这种方法看起来像是一种蛮力

sort是nlogn,但是对max的简单搜索是n

3 个答案:

答案 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)您可以保存最旧的一个,直到它发生变化。如果您必须经常找到最旧的托管对象,这可能会节省大量工作。

这取决于您的应用程序(插入/删除托管对象的次数以及您需要最旧对象的次数)。