2011-12-29 41 views
3

我需要從coredata最新日期CoreData謂最新的存儲日期

我找到了一種方法

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

[fetchRequest setFetchLimit:1]; 

的日期,以便對它們進行排序,然後選擇第一個

但是可以這樣沒有做得更好?這種方法看起來像一個蠻力

排序是nlogn,但最大簡單搜索爲n

回答

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"]); 
    } 
} 

這更詳細下描述取Web管理對象 - >抓取特定值在CoreData文檔。

0

我想這幾乎是最好的方式。我不確定是否有更有效的方法,因爲無論如何都要比較每一個日期,以找出最古老的日期。 以下是其他兩種方法:

1)您可以使用BOOL作爲管理對象的屬性。 (比如最老的= 1) 但是,每次刪除時都必須找到一個新的「最舊」管理對象。

2)你可以保存最舊的一個,直到它改變。如果您必須經常查找最老的managedObject,這可能會節省很多工作。

這取決於您的應用程序(插入/移除管理對象的次數以及您需要最舊對象的次數)。

1

第2行maxDate表達式指向自身(maxDate)。 我認爲這必須是第一行的「日期」變量。