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

Posted

技术标签:

【中文标题】如何获取 Core Data 数据库的最后一条记录?【英文标题】:How do I get the last record of a Core Data database? 【发布时间】:2011-04-01 00:54:14 【问题描述】:

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

imageName = NSString
timeStamp = NSNumber

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

所有图片都加上时间戳,通过使用获得

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

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

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

谢谢

【问题讨论】:

【参考方案1】:

执行提取请求,按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: 来限制结果的数量。

【讨论】:

【参考方案2】:

我尝试使用 Chris Doble 提到的方法,发现它非常慢,特别是如果需要提取大量记录并根据时间戳检查。如果你想加快速度,我现在在我的 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 的记录,但对我来说,这是最好的选择。

希望这对其他人也有帮助。

【讨论】:

你可能忘记索引你的时间戳字段了。【参考方案3】:

在 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)
    

【讨论】:

这与问题有什么关系?它只是获取(非空)数组中的最后一条记录,与 Core Data 无关。另外,如果你想要最后一条记录,为什么不使用entity.last(尤其是如果entity为空,你的代码会崩溃)

以上是关于如何获取 Core Data 数据库的最后一条记录?的主要内容,如果未能解决你的问题,请参考以下文章

使用来自 Core Data 的日期获取记录

将数据从Core Data加载到Today Widget

将数据从 Core Data 加载到 Today Widget

如何从 Sqlite 获取最后一条记录?

如何获取最后一条记录/最大值

如何获取mysql中最后一条之前的最后一条记录?