如何按照数据被添加的顺序获取Core Data并在UITableView中按照那个顺序显示



我在UITableViewController中显示一个名为Skills的实体。我在viewDidLoad中获取这样的结果:

-(void)fetchTableData {
    NSManagedObjectContext *context = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Skills" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];
    NSError *error;
    self.skillsArray = [[self.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
}

我的单元格索引路径是:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
    // Configure the cell...
    Skills *skill = self.skillsArray[indexPath.row];
    // Skills is a NSManagedObject, I added the Skills.h file.
    [cell.textLabel setText:skill.nameOfSkill];
    return cell;
}

和我添加新的NSManagedObject *newSkill到核心数据通过使用UIAlertView在委托方法中的文本字段:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (buttonIndex == 1) {
      NSLog(@"Add button clicked");
      NSString *newSkillText = [alertView textFieldAtIndex:0].text;
      NSManagedObjectContext *context = [self managedObjectContext];
      Skills *newSkill = [NSEntityDescription insertNewObjectForEntityForName:@"Skills" inManagedObjectContext:context];
      newSkill.nameOfSkill = newSkillText;
      [self.skillsArray addObject:newSkill];
    } else {
       // Do something else
    }
    [self.tableView reloadData];
}

每次我重新加载数据时,单元格都按照数据添加的顺序显示数据,但如果取消视图控制器并返回单元格,则以不同的顺序显示数据?奇怪的部分是,我使用相同的代码来添加核心数据并在另一个UITableViewController中检索它,它从不显示无序。在这个UITableViewController中添加的数据如下:我正在推到另一个UIViewController,并在那里添加信息,然后解散回表视图。在这段代码中,我添加的信息,而在视图控制器正在呈现,也许这可能有一些事情与它?
我还知道我可以添加一个nssortdescriptor例如:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]initWithKey:@"nameOfSkill" ascending:YES];
NSArray *sortDescriptors = @[sortDescriptor];

,但它是按名称来做的,我希望按添加的方式来做而不需要为index添加另一个属性,因为我从来没有对其他数据这样做过它总是按添加的顺序显示。

你必须添加一个属性来排序…更新、递增计数器或插入的时间戳。如果你子类NSManagedObject,你可以在-awakeFromInsert中写这个值。然后tableview的取回请求会对属性进行排序

您将无法原样获得数据。您必须插入一个"时间"字段,然后您可以根据它进行排序。

添加一个唯一字段'data_id'。总是在插入数据之前检查计数。并相应地将data_id添加到计数中。然后,从核心数据中获取数据后,按data_id排序。

你可以按你喜欢的做。

要得到期望的结果,您需要根据时间戳或core data数据库自动生成的主键对其进行排序。

Core Data有它自己的主键——你不需要添加一个。您可以使用

检索它

nsmanagedobjecd *moID = [managedObject objectID];

最新更新