如何获取Core Data数据库的最后一条记录?

时间:2011-04-01 00:54:15

标签: iphone core-data

我有一个名为images的核心数据实体,只有两个字段:

imageName = NSString
timeStamp = NSNumber

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

所有图像都添加了时间戳,使用

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

一个等于1970年以来的秒数的整数

那么,如何检索核心数据的最后插入记录(=具有最大时间戳编号的记录)???

感谢

3 个答案:

答案 0 :(得分:23)

执行获取请求,按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];

您可能还希望使用NSFetchRequest的{​​{1}}来限制结果数量。

答案 1 :(得分: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的记录,但对我来说这是最好的选择。

希望这也有助于其他人。

答案 2 :(得分:-1)

在Swift 4中,声明:

let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let entity = [Entity]()


func getLastRecord() {
     let entityCount = (entity.count - 1)
     let lastRecord = entity[entityCount] // This is the las attribute of your core data entity
     print(lastRecord)
    }