1

我正在尝试将外部数据添加到 SQLite / 使用 Core Data 更新现有数据。

基本上,我从外部 Web 服务获得了一个 JSON,我正在使用以下代码来确定是否应该在 DB 中添加新对象或更新现有对象。

NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
[fetch setEntity:[NSEntityDescription entityForName:@"name" inManagedObjectContext:context]];
[fetch setPredicate:[NSPredicate predicateWithFormat:@"id = %@", [data valueForKey:@"key"]]];
NSArray *results = [context executeFetchRequest:fetch error:nil];

if (results.count == 1)
{
    // update existing
}
else
{
    // add new
}

问题是:有时这段代码会导致异常:

Thread 1: EXC_??? (11) (code=0, subcode=0x0)

异常在NSManagedObjectContext executeFetchRequest:error:

如果我继续执行我的应用程序,一切似乎都很好。

我应该担心这个例外吗?

我的意思是拥有它有点烦人,但更重要的是要知道这个异常的原因和后果是什么?

一些额外的细节(以防万一):

  • 上面的代码在一个循环中被执行多次(大约 25 万次)。
  • 代码在主线程上运行(是的,我知道,但它是一种原型)。
  • 上下文是在主线程上创建的。
  • 外部数据在后台线程中创建

[编辑]更多细节:

  • executeFetchRequest:error即使引发异常,也返回初始化数组。
  • error当我提供参数时没有设置错误executeFetchRequest:error
4

1 回答 1

1

那不安全。

您应该检查方法的返回以确保您收到了一个数组

NSArray *results = [context executeFetchRequest:fetch error:nil];
if (!results) {
    // An error occurred you should probably use the out error
}

此外,CoreData 似乎在内部抛出异常但会处理它们,所以如果你设置了异常断点,它很可能会在 CoreData 堆栈中的随机点被捕获——我是根据过去的经验说的,不确定它是否记录在任何地方,但它是本视频中提到的调试技巧 - Mike Hay

于 2013-02-11T15:38:51.710 回答