【问题标题】:How to fetch Core Data by the order the data was added and display in that order in a UITableView?如何按添加数据的顺序获取核心数据并在 UITableView 中按该顺序显示?
【发布时间】:2014-10-13 06:42:50
【问题描述】:

我在 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;
}

我通过在委托方法中使用带有文本字段的UIAlertView 将新的NSManagedObject *newSkill 添加到Core Data:

- (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 并在那里添加信息,然后关闭回tableview。在这段代码中,我在显示视图控制器时添加了信息,也许这可能与它有关?
我也知道我可以添加一个 NSSortDiscriptor,例如:

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

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

【问题讨论】:

标签: ios objective-c xcode uitableview core-data


【解决方案1】:

您不会按原样获取数据。您必须插入一个“时间”字段,然后您可以根据它进行排序。

添加 'data_id' 的唯一字段。在插入数据之前始终检查计数。并相应地将 data_id 加到计数中。然后在从核心数据中获取数据后,按照 data_id 对其进行排序。

你可以随心所欲。

【讨论】:

    【解决方案2】:

    对于想要的结果,您需要根据核心数据数据库自动生成的时间戳或主键对其进行排序。

    Core Data 创建自己的主键 - 您不必添加主键。您可以使用检索它

    NSManagedObjectID *moID = [managedObject objectID];

    【讨论】:

    • 我不会假设 objectID 的排序将按照对象的创建顺序进行。只需创建一个带有时间戳的属性。
    【解决方案3】:

    您必须添加一个属性来排序……更新、递增计数器或插入的时间戳。如果你继承 NSManagedObject,你可以在-awakeFromInsert 中写入这个值。然后您的 tableview 的 fetch 请求将按该属性排序。

    【讨论】:

      猜你喜欢
      • 2021-08-23
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多