尝试使用 NSFetchedResultsController 重新排序 UITableView

Attempting to reordering UITableView using an NSFetchedResultsController

我试图在使用核心数据和 NSFetchedResultsController 时编辑我的 UITableView 的顺序。据我了解,Core Data 没有用于在 Core Data 模型中重新排列对象的内置方法。

我的想法是创建一个数组,在那里重新排序我的对象,然后将该数据写回我的模型。

NSFetchedResultsController

-(NSFetchedResultsController *) fetchedResultsController {
    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
}

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSManagedObjectContext *context = [self managedObjectContext];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"List" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"listName" ascending:YES];
    NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:sortDescriptor, nil];
        fetchRequest.sortDescriptors = sortDescriptors;
        _fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];
        _fetchedResultsController.delegate = self;
    return _fetchedResultsController;
}

moveRowAtIndexPath

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath; {
    NSMutableArray *toDoItems = [[self.fetchedResultsController fetchedObjects] mutableCopy];
    NSManagedObject *managedObject = [[self fetchedResultsController] objectAtIndexPath:sourceIndexPath];
    [toDoItems removeObject:managedObject];
    [toDoItems insertObject:managedObject atIndex:[destinationIndexPath row]];
    int i = 0;
    for (NSManagedObject *moc in toDoItems) {
        [moc setValue:[NSNumber numberWithInt:i++] forKey:@"listName"];
    }

    [self.managedObjectContext save:nil];
}

当我点击 Edit 按钮时,我可以重新排列行,但一旦我松开行,我的应用程序就会崩溃。当它崩溃时,我在控制台中没有得到任何类型的堆栈跟踪。

我在异常上设置了一个断点,它似乎在这一行崩溃了

[moc setValue:[NSNumber numberWithInt:i++] forKey:@"listName"];

我的密钥名称是正确的。但我现在意识到这是完全错误的,因为我试图将其设置为一个数字,但事实并非如此。

我们将不胜感激任何正确方向的建议或推动。

不要复制 NSManagedObject。它是由核心数据管理的对象。如果你想要一个新的,请询问上下文。

要么 修改您的代码以设置 listName 的字符串值,如下所示:

[moc setValue:[NSString stringWithFormat:"%d",i++] forKey:@"listName"];

(但请注意,因为默认情况下这将按字符串排序,因此 11 在 2 之前,依此类推)。

所以,更好的是, 向您的模型添加一个整数属性,并使用它对获取的结果控制器进行排序。