我有一个名为images的核心数据实体,只有两个字段:
imageName = NSString
timeStamp = NSNumber
我正在尝试模拟一种堆栈LIFO(后进先出)。 插入新条目很简单,但是读取添加到实体的最后一个条目呢?
所有图像都添加了时间戳,使用
获得time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];
一个等于1970年以来的秒数的整数
那么,如何检索核心数据的最后插入记录(=具有最大时间戳编号的记录)???
感谢
答案 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)
}