2011-08-15 48 views
0

我有一些应用程序,例如一些股票信息,并将其存储在CoreData中。我有两个实体库存(名称)和DailyStockData(日期,编号),我存储了每个股票实体的两年信息。然后用户可以删除TableView中的一些股票名称。如何从CoreData快速删除?

在我的- (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(); 
} 

的问题是:当用户删除股快速 - 我的应用程序崩溃。我知道原因是“中止”命令,当我的设备没有完成保存先前的删除事务并呼叫再次保存。

所以我在这里有两个问题^) 1.有什么办法来防止这种崩溃? 2.处理上下文保存错误的最佳做法是什么?可能是我可以尝试保存它一次又一次,而不是仅仅中止。

最简单的解决方案是重新设计应用程序以在“非常”的末端保存上下文 - 例如,当我的应用程序更改视图或其他东西,但我想知道所有可能性。

+0

这可能有助于发布实际的错误文本。 –

+0

书籍中的示例中止,因为他们只是想提醒开发人员注意失败。你永远不会放弃发布应用程序。相反,您应该捕获错误,记录它,分析错误并采取适当的措施。 – TechZen

回答

3

您不应该经常调用“保存”,这对性能不利。

“保存”方法让CoreData实际上将修改后的数据保存到磁盘,如果需要保存大量数据,则需要时间。

只需保存一次,而您的应用程序即将退出或后台足够好。

如果您担心意外崩溃会丢失一些数据,您可以在用户停止修改数据一段时间或退出应用程序中的编辑视图时调用“保存”。这取决于你的决定,但每次数据改变时都不会保存。

+0

我从一些关于CoreData的书中形成了这种习惯,他们在每次经历很小的变化之后都会保存上下文。 – Sergnsk

0

我所做的是,我使用CoreData创建数据库,但我不使用模拟器将信息放入数据库。我使用Navicat Lite将信息输入到数据库中。如果你想删除整个数据库,只需从用户/库/应用程序支持/ iphone模拟器// applications/documents /下的模拟器文件夹中删除它。这将删除整个数据库,除非你已经与你的应用程序文件夹同步。

0
  1. 有什么办法可以防止这种崩溃?

是的,删除abort()。当您不想花时间记录,分析或响应错误时,仅在次要示例代码中使用中止。你永远不会在真正的代码中使用它。

  1. 什么是处理上下文保存错误的最佳做法?

做的第一件事是让你有一些想法什么是真正失败的登录细节错误。

我明白,当我的设备没有 完成保存以前删除的交易,并呼吁再次保存它的原因是“中止”命令。

不太可能。用户界面驱动的操作几乎不可能,以人为速度工作,使本地计算机操作超载。在核心数据中保存数百个对象只需要几毫秒,而人员需要一秒或更多时间来删除用户界面中的一行。如果在UI正在使用时发生崩溃,则该错误可能与UI相关,例如没有正确更新tableview的部分和行数。

不要猜测。记录保存错误并找出实际发生的情况。

+0

你是对的。我在崩溃日志中查看错误的线程。这是我的错^)不是CoreData)我在这里问了关于它的另一个问题 - http://stackoverflow.com/questions/7083077/crash-when-calculate-data-and-draw-it-in-different-threads – Sergnsk