2013-02-11 15 views
1

我想添加外部數據到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
+0

實際上是說'EXC _ ???'而不是' EXC_BAD_ACCESS'? – trojanfoe 2013-02-11 13:11:47

+0

@trojanfoe是的,它實際上是說'EXC _ ???' – Bobrovsky 2013-02-11 13:12:53

+0

只是一個瘋狂的猜測,但你是否正在初始化'results'數組? – jhilgert00 2013-02-11 13:19:39

回答

1

這不是安全的。

您應該檢查方法的返回值,以確保你交給一個數組回來

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