【问题标题】:How delete from CoreData fast?如何快速从 CoreData 中删除?
【发布时间】:2011-08-15 22:26:49
【问题描述】:

例如,我有一个包含一些股票信息的应用程序并将其存储在 CoreData 中。我有两个实体 Stock(name) 和 DailyStockData(date,number),我为每个股票实体存储了两年的信息。然后用户可以在 TableView 中删除一些股票名称。

在我的- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 我删除了这个 Stock 和 DailyStockData 级联,然后保存上下文。

我的存档代码是这样的

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

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

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

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

【问题讨论】:

  • 发布实际的错误文本可能会有所帮助。
  • 书中的示例中止,因为它们只是想提醒开发人员注意失败。您永远不会在发布应用程序中中止。相反,您应该捕获错误、记录错误、分析错误并采取适当的措施。

标签: iphone ios core-data


【解决方案1】:

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

“save”方法让CoreData真正将修改后的数据保存到你的磁盘,如果需要保存的数据很多,需要时间。

在您的应用程序即将退出或进入后台时保存一次就足够了。

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

【讨论】:

  • 我从一些关于 CoreData 的书籍中养成了这个习惯,他们每次都会保存上下文,即使是很小的变化。
【解决方案2】:

我所做的是,我使用 CoreData 创建数据库,但我不使用模拟器将信息放入数据库。我使用 Navicat lite 将信息放入数据库。如果要删除整个数据库,只需从 user/library/application support/iphone Simulator//applications//documents/ 下的 Simulators 文件夹中删除即可。这将删除整个数据库,除非您已与您的应用程序文件夹同步。

【讨论】:

    【解决方案3】:
    1. 有什么方法可以防止这种崩溃吗?

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

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

    首先要做的是详细记录错误,以便您了解实际失败的原因。

    我知道原因是我的设备没有执行“中止”命令 完成保存之前的删除事务并调用以再次保存。

    不太可能。以人类速度工作的 UI 驱动动作几乎不可能使任何本地计算机操作过载。即使在 Core Data 中保存数百个对象也只需要几毫秒,而人类在 UI 中删除一行需要整整一秒或更长时间。如果在使用 UI 时发生崩溃,则错误可能与 UI 有关,例如没有正确更新表格视图的部分和行数。

    别猜了。记录保存错误并找出实际发生的情况。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2015-03-28
    相关资源
    最近更新 更多