2011-04-01 150 views
3

我有一个核心数据实体被称为刚2场中的图像:如何获取核心数据数据库的最后记录?

imageName = NSString 
timeStamp = NSNumber 

我试图模拟一种栈后进先出法(在后进先出)。 插入一个新条目很简单,但是读取添加到实体的最后一个条目呢?

所有图像都添加有时间标记,通过使用

time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970]; 

的整数自1970年以来

使得等于的秒数获得如何检索的最后插入的记录核心数据(=有最大时间戳记录的记录)???

感谢

回答

22

执行由timeStamp取请求,排序的结果。

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
[request setEntity:...]; 

// Results should be in descending order of timeStamp. 
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"timeStamp" ascending:NO]; 
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 

NSArray *results = [managedObjectContext executeFetchRequest:request error:NULL]; 
Entity *latestEntity = [results objectAtIndex:0]; 

您可能还需要限制使用NSFetchRequestsetFetchLimit:结果的数量。

+0

ahhhhhhhhhhhhhhhh,简直太完美了!谢谢!!!!! – SpaceDog 2011-04-01 05:06:21

0

我尝试过使用Chris Doble提到的方法,发现它非常慢,尤其是如果有很多记录需要拉动和检查timeStamp。如果你想加快速度,我现在在我的ManagedObject上设置一个名为isMostRecent的属性,我可能想要从中获取最新的属性。当要存储新记录时,只需抓取具有此属性设置为YES的最新记录并将其更改为NO,然后将正在存储的新记录设置为YES。下一次,我需要抢到最近的记录,我所要做的就是...

+ (Photo*)latestPhotoForMOC:(NSManagedObjectContext*)context { 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:kCoreDataEntityNamePhoto 
              inManagedObjectContext:context]; 
    [request setEntity:entity]; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"isMostRecent == %@", [NSNumber numberWithBool:YES]]; 
    [request setPredicate:predicate]; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"isMostRecent" ascending:NO]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
    [request setSortDescriptors:sortDescriptors]; 

    NSError *error = nil; 
    NSMutableArray *mutableFetchResults = [[context executeFetchRequest:request error:&error] mutableCopy]; 

    Photo* photo = nil; 
    if (mutableFetchResults && mutableFetchResults.count > 0) { 
     photo = [mutableFetchResults objectAtIndex:0]; 
    } 

    return photo; 
} 

我发现这样会快得多。是的,它需要你多一点,以确保它被正确使用,并且你永远不会得到多于一条记录标记为isMostRecent,但对我来说这是最好的选择。

希望这可以帮助别人。

+1

你可能忘记了索引你的时间戳字段。 – malhal 2015-01-17 20:26:27