EXC _ ???而执行executeFetchRequest
问题描述:
我想添加外部数据到SQLite /使用核心数据更新现有数据。EXC _ ???而执行executeFetchRequest
基本上,我从外部Web服务得到了一个JSON,并且我正在使用以下一段代码来确定是否应该在数据库中添加新的或更新现有对象。
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)
异常在
提出如果我继续我的应用程序的一切执行似乎确定。
我应该担心这个异常吗?
我的意思是有一种恼人的感觉,但更重要的是要知道原因是什么,以及这种例外的后果是什么?
一些额外的细节(以防万一它是有关):
- 以上代码获取一个循环(约250万次)执行多次。
- 代码在主线程上运行(是的,我知道,但它是一种原型)。
- 上下文在主线程上创建。
- 外部数据在后台线程中
[编辑]创建了一些更详细地:
-
executeFetchRequest:error
返回初始化即使当异常被凸起的阵列。 - 没有错误集时我提供
error
参数executeFetchRequest:error
答
这不是安全的。
您应该检查方法的返回值,以确保你交给一个数组回来
NSArray *results = [context executeFetchRequest:fetch error:nil];
if (!results) {
// An error occurred you should probably use the out error
}
而且CoreData似乎内部抛出异常,但处理它们,所以如果你有一个异常断点设置将最很可能被CoreData堆栈中的随机点所捕获 - 我从过去的经验中说这不确定它是否记录在任何地方,但在本视频中提到Debugging Tips - Mike Hay
+0
谢谢,链接很有用。 – Bobrovsky 2013-02-14 06:39:43
实际上是说'EXC _ ???'而不是' EXC_BAD_ACCESS'? – trojanfoe 2013-02-11 13:11:47
@trojanfoe是的,它实际上是说'EXC _ ???' – Bobrovsky 2013-02-11 13:12:53
只是一个疯狂的猜测,但你是否正在初始化'results'数组? – jhilgert00 2013-02-11 13:19:39