如何获取 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];
您可能还想使用NSFetchRequest
的setFetchLimit:
来限制结果的数量。
【讨论】:
【参考方案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 数据库的最后一条记录?的主要内容,如果未能解决你的问题,请参考以下文章