2016-07-10 95 views
2

基本上,我試圖在從NSManagedObjectContext中刪除它並保存上下文後訪問某些屬性。問題在於,在保存上下文之後,Core Data將對象數據標記爲故障,顯然無法恢復它。刪除被管理對象後的核心數據錯誤

我創建了一個示例項目,以複製的問題,您可以下載它here。爲了說明,下面的代碼片斷:

City *city = [self.cities objectAtIndex:indexPath.row]; 
[self.managedObjectContext deleteObject:city]; 
if (![self.managedObjectContext save:&error]) { 
    [self.managedObjectContext rollback]; 
    NSLog(@"Error: %@", error); 
}else{ 
    NSLog(@"%@", city); 
    // All properties of "city" are zeroed. 
    // Saved. Update data sources and animate changes... 
} 

生產:

<City: 0x7fe1cbd3cba0> (entity: City; id: 0xd000000000040004 <x-coredata://C1E3D3D8-188D-41DE-B701-08AF6D3E8860/City/p1> ; data: { 
    country = "0xd000000000080002 <x-coredata://C1E3D3D8-188D-41DE-B701-08AF6D3E8860/Country/p2>"; 
    name = Rosario; 
}) 

<City: 0x7fe1cbd3cba0> (entity: City; id: 0xd000000000040004 <x-coredata://C1E3D3D8-188D-41DE-B701-08AF6D3E8860/City/p1> ; data: <fault>) 

我想訪問管理對象,將其刪除後的原因,是更新NSMutableArray充當數據源一個表格視圖並更新導航控制器堆棧中前一個控制器中的另一個數據源(這在示例項目中未實現)。

結束語,我的問題是:

刪除其NSManagedObjectContext一個NSManagedObject和保存上下文之後,它不再保證在管理對象中的數據可以被訪問?即使保存對該被管理對象的引用?

基於我研究過,核心數據是擺脫實體數據一旦上下文被保存以節省內存。這個假設是否正確?是否有其他因素可能導致此次數據錯誤?

謝謝。

+1

爲什麼您希望在保存上下文後能夠訪問已刪除的對象?使用'NSFetchedResultsController'作爲數據源。 – Avi

+0

您不應該使用對已刪除對象的引用。 – Andy

+0

@Avi,因爲我保留了對託管對象的引用。 – Mateus

回答

1

總是動態呈現一個NSManagedObject。因此,如果它被刪除,Core Data會將數據錯誤地排除。它不再存在。你真正的問題是如何從你的各種數組中刪除一個對象?首先,你應該刪除它之前,你使用任何你想要的搜索技術刪除對象。這是最簡單和最健壯的路徑。其次,對象指針本身仍然有效,可以與-removeObject:調用一起使用。但請允許我強調,這是一個脆弱的解決方案。我強烈建議您在刪除對象之前刪除它。

在回答你的第二個問題,

是導致此數據的斷層有其他因素?

號刪除對象是造成斷裂。如果數據迄今爲止已經可用,那是因爲它是一個實現特徵。寫入實現而不是規範,特別是數據庫技術,充滿了各種生命週期問題。引用明智的博士,「不要那樣做。」

+0

謝謝!你能否詳細說明爲什麼在刪除對象並確保上下文被保存後不願意刪除對象? – Mateus

+0

是的,上下文保存幾乎不會失敗。基本上,它會因非常罕見的磁盤中斷而失敗。如果空間不足,iOS會很好地真正擰緊。它提前警告用戶。如果他們忽視問題,他們可能無法啓動您的應用程序。其次,你應該把一個被刪除的對象視爲一個殭屍。只有你知道你發送了殭屍到另一種方法。它期待一個活的對象。因此,你打破了與被調查者的合同。你應該期待被調用者中斷。 – adonoho

相關問題