我有一个带有一些股票信息的应用程序,并将其存储在CoreData中。我有两个实体股票(名称)和DailyStockData(日期,数字),我存储每个股票实体的两年信息。然后用户可以删除TableView中的一些股票名称。
在我的- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
中
我删除了这个股票和DailyStockData级联,然后保存上下文。
我的保存代码如下所示
// Save the context.
NSError *error = nil;
if (![context save:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
问题是:当用户快速删除股票时 - 我的应用程序崩溃了。我明白原因是" abort"命令我的设备没有完成保存上一个删除事务并调用再次保存它。
所以我在这里有两个问题^) 1.有什么方法可以防止这次崩溃吗? 2.处理上下文保存错误的最佳做法是什么?也许我可以尝试一次又一次地保存它,而不仅仅是中止。
最简单的解决方案是重新设计应用程序以保存"非常"结束 - 例如当我的应用程序更改视图或其他内容但我想知道所有可能性时。
答案 0 :(得分:3)
你不应经常调用“保存”,这对性能不利。
“save”方法让CoreData实际将修改后的数据保存到磁盘中,如果需要保存大量数据需要时间。
只需在您的应用程序退出或保存背景时保存一次即可。
如果您担心意外崩溃会丢失一些数据,您可以在用户停止修改数据一段时间或退出应用程序中的编辑视图时调用“保存”。这取决于您的决定,但每次更改数据时都不要保存。
答案 1 :(得分:0)
我所做的是,我使用CoreData创建数据库,但我不使用模拟器将信息输入数据库。我使用Navicat lite将信息输入数据库。如果要删除整个数据库,只需将其从用户/库/应用程序支持/ iphone模拟器// applications / documents /下的simulators文件夹中删除即可。这将删除整个数据库,除非你已经与你的应用程序文件夹同步。
答案 2 :(得分:0)
- 有没有办法防止这次崩溃?
醇>
是的,删除abort()
。当您不想花时间记录,分析或响应错误时,中止仅用于次要示例代码。你永远不会在实际代码中使用它。
- 处理上下文保存错误的最佳做法是什么?
醇>
要做的第一件事就是详细记录错误,以便您了解实际失败的原因。
我明白,当我的设备没有时,原因是“abort”命令 完成保存上一个删除事务并调用再次保存它。
不太可能。对于以人类速度工作的UI驱动动作,几乎不可能使任何本地计算机操作过载。在Core Data中保存甚至几百个对象只需要几毫秒,而在UI中删除一行需要一整秒或更长的时间。如果在UI正在使用时发生崩溃,则该错误可能与UI有关,例如没有正确更新tableview的节和行计数。
不要猜。记录保存错误并找出实际发生的情况。