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

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

imageName = NSString
timeStamp = NSNumber

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

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

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

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

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

谢谢

【问题讨论】:

    标签: iphone core-data


    【解决方案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为空,你的代码会崩溃)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 2012-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多