我在app中使用核心数据和NSFetchedResultsController,用于为UIViewTable提供Car对象。我有一个按钮,当用户可以添加新车时,在选项卡时将应用程序带到另一个视图。我遇到的问题是即使用户没有在第二个视图中创建汽车,它也会被添加到表中。如果我重新启动应用程序,则Car未添加到数据库中。
这与我在viewDidLoad方法的第二个视图中使用以下内容创建Car实例有关:
car = [NSEntityDescription insertNewObjectForEntityForName:@"Car"
inManagedObjectContext:context];
即使我不保存上下文,也会添加。
我试图在第二个视图即将关闭时删除该对象,使用:
[context deleteObject:car];
这部分有效。汽车未添加到第一页中的表中,但看起来数据源的索引已更改。如果我一直向下滚动,我得到了这个错误:
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[_PFBatchFaultingArray objectAtIndex:]: index (9) beyond bounds (9)'
任何想法都将受到赞赏。
答案 0 :(得分:1)
尝试通过传递nil
上下文来创建您的汽车对象:
car = [NSEntityDescription insertNewObjectForEntityForName:@"Car"
inManagedObjectContext:nil];
从那里,如果用户决定保存它,您可以将对象移动到主要上下文。
另一个选择是为此视图设置单独的MOC(这会增加不必要的复杂性),然后在需要时再次在上下文之间移动对象。
干杯,
罗格
PS:如果您想知道是否可以将nil作为managedObjectContext传递,这可以直接来自Apple在NSManagedObject上的文档:
...如果上下文不是nil,这个方法 调用[context insertObject:self] (导致awakeFromInsert 调用)...
更多详情here
<强> [编辑] 强>
除此之外,我在查看NSFetchRequest文档时发现了一些有趣的东西,并认为你可能想要去(我还没有尝试过)。在获取对象时,您似乎可以告诉fetchRequest是否包含挂起的更改(即未保存):
- (void)setIncludesPendingChanges:(BOOL)yesNo
仅供参考,默认值为YES - 更多详情here
答案 1 :(得分:0)
首先,尝试在用户提交更改时延迟插入新对象。
只有在不合适的情况下:
当上下文发生更改时,会自动通知NSFetchedResultsController修改传递给表视图控制器的数据。但是,表格视图本身是不修改,因此您必须自己更新表格视图。
这就是为什么NSFetchedResultsController有一个委托对象(符合NSFetchedResultsControllerDelegate协议),它负责更新表视图。
例如,在CoreDataBooks示例项目中,您将在RootViewController类中看到此协议的委托方法。最相关的委托方法是controller: didChangeObject: atIndexPath: forChangeType: newIndexPath:
。您可能想要执行以下操作:
if (changeType == NSFetchedResultsChangeDelete) {
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}