3

所以我有一个对我来说工作正常的核心数据和 iCloud 组合数据库。

一些用户在尝试删除在 UITableView 中表示的 NSManagedObject 后发生了一定的崩溃。在我附加到崩溃报告的调试日志中,崩溃前有以下错误日志:

2013-05-08 22:38:51.851 MyApp[11819:907] Unresolved error Error Domain=NSCocoaErrorDomain Code=134030 "The operation couldn’t be completed. (Cocoa error 134030.)", {
}

不幸的是,关于错误的信息:{} 是空的,我自己从来没有遇到过错误,所以我不知道如何重新创建它。不过,对于客户来说,它确实发生了至少 21 次。(更糟糕的是,一旦他们重新打开应用程序,一些 NSManagedObject 处于无效状态,我的 tableview 加载它时出现问题。但就在旁边)

实际错误是“tableView:commitEditingStyle:forRowAtIndexPath:”中的“SIGABRT”,下面是相应的代码:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        ICLog(@"Deleting the row %i,%i from the data source", indexPath.row, indexPath.section);
        NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
        [context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];

        //Save the context
        NSError *error;
        if (![context save:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        }
    }   
}

PS:从日志中也可以清楚地看出这一切都是从主线程运行的。

这里有人也有这个问题吗?

更新

幸运的是,我刚刚在另一个我正在开发的应用程序中遇到了同样的错误,在我也可以访问的设备中(到目前为止,我从未在我的任何设备上看到这种情况发生),所以现在我可以在它发生时对其进行调查。这是我发现的:

a) 在设置中关闭 icloud 后它仍然会发生
b) 每次我尝试删除或插入任何 NSManagedObject 时都会发生错误,即使我在启动后立即在我的 Appdelegate 中执行此操作,而从未在其他地方访问数据

所以似乎有什么东西完全阻止了我的数据库被更新。我可以捕捉到上述异常,那么应用程序至少不会崩溃。但是当然不会保存对数据库的任何更改。

4

3 回答 3

0

可选关系你确定它是可选的吗?Xcode 在什么意义上是可选的?我曾经遇到过这个问题,这是由于“可选”关系造成的。

于 2013-09-13T17:45:39.720 回答
0

我将在这里做一些假设。

我可以看到的是,您删除了CoreData object使用该对象,fetchedResultsController但您永远不会从您用作ViewController iVar获取存储的任何内容中取消设置该对象,并在删除后numberOfRowsInSection重新组织您的表。index

让说你的原件[indexPath.row count] is 7然后你继续indexPath.row = 5从你的tableView. 然后,您继续尝试删除indexPath.row = 6tableView 索引上存在的该项目的另一个对象,因为您尚未重新组织indexs,但它不会存在于CoreData.... 鉴于现在最大计数是6索引值现在5是什么最初是6......这可能是您的用户正在经历的......

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [yourFetchedDataVariable count];
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        ICLog(@"Deleting the row %i,%i from the data source", indexPath.row, indexPath.section);
        NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
        [context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];

        //Save the context
        NSError *error;
        if (![context save:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        }
        // the possible solution
        [yourFetchedDataVariable removeObjectAtIndex:indexPath.row];
        // also now you want to re-order your array index...
        [yourTable reloadData]; // and re order your table indexses aswell
    }
}
于 2013-09-10T10:05:17.043 回答
0

当您尝试保存数据模型的无效状态时,通常会发生 [context save:] 错误。

由于您之前删除了一个对象,我会怀疑该对象与仍然存在的其他对象有关系,但现在它的关系处于无效状态(对于非可选的关系为零)

检查您的删除规则可能会有所帮助,也许与您删除的对象的某些关系需要是可选的,或者您必须正确传播删除。

于 2013-09-07T12:07:33.880 回答