如何按添加数据的顺序获取核心数据并在UITableView中按顺序显示?

时间:2014-08-20 02:10:33

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

我在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并在那里添加信息,然后关闭回到tableview。在这段代码中,我正在呈现视图控制器中的信息,也许这可能与它有关?
另外我知道我可以添加NSSortDiscriptor,例如:

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

但它是通过名称来实现的,我希望通过它的添加方式而不必为索引添加另一个属性,因为我从未对我的其他数据执行此操作,并且它始终按照添加的顺序显示。

3 个答案:

答案 0 :(得分:2)

您必须添加一个属性来排序......更新,递增计数器或插入的时间戳。如果您子类化NSManagedObject,则可以在-awakeFromInsert中写入此值。然后,您的tableview的获取请求将对该属性进行排序。

答案 1 :(得分:1)

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

OR

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

你可以按照自己的意愿去做。

答案 2 :(得分:0)

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

Core Data制作自己的主键 - 您不必添加一个。您可以使用

检索它

NSManagedObjectID * moID = [managedObject objectID];