2014-01-21 67 views
2

感謝您的閱讀。我們已經收到了崩潰報告對我們的iOS應用程序,出現以下錯誤:「'NSInternalInconsistencyException'的替代原因,原因:'此NSPersistentStoreCoordinator沒有持久存儲'。」

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.' 

這發生在我們的主隊列的NSManagedObjectContext試圖保存:

BOOL saved = [managedObjectContext save:&error]; 

在哪一個塊中出現通過提交

[managedObjectContext performBlockAndWait:saveBlock]; 

互聯網(特別是SO)充滿了對這個錯誤的解釋,表明我們從來沒有一個持久的商店cooridinater(我們沒有創建它適當的時候whe ñ我們建立了核心數據堆棧)。但是,如果沒有持久性商店協調員,我們很難看到如何在程序執行中實現這一點。對於踢球,我評論了我們設置持久存儲和應用幾乎立即崩潰的路線(沒有進入我們的保存方法)。

有誰知道是否有這種異常的替代原因,還是總是因爲沒有持久存儲?有什麼方法可以丟失持久性商店?

多一點顏色:我們使用父/子NSManagedObjectContexts爲了在後臺線程中加載數據。完整的保存方法是這樣的:

-(void)saveWithManagedObjectContext:(NSManagedObjectContext*)managedObjectContext successHandler:(void (^)())successHandler failureHandler:(void (^)(NSManagedObjectContext* managedObjectContext, NSError*))failureHandler 
{ 
    void(^saveBlock)() = ^() { 
     NSError *error = nil; 
     BOOL saved = [managedObjectContext save:&error]; 
     if (!saved) { 
      if (error != nil) { 
       NSLog(@"Unresolved error saving %@, %@", error, [error userInfo]); 
      } 
      failureHandler(managedObjectContext, error); 
     } else { 
      if (managedObjectContext.parentContext != nil) { 
       [self saveWithManagedObjectContext: managedObjectContext.parentContext successHandler:successHandler failureHandler:failureHandler]; 
      } else { 
       successHandler(); 
      } 
     } 
    }; 

    BOOL isMainContext = managedObjectContext.parentContext == nil; 

    if (isMainContext) { 
     [managedObjectContext performBlockAndWait:saveBlock]; 
    } else { 
     [managedObjectContext performBlock:saveBlock]; 
    } 
} 

它可以從一個後臺線程調用,它將調用保存:對的NSManagedObjectContext通過performBlock:然後rescursively呼籲家長的NSManagedObjectContext這個方法,以保存。當應用程序崩潰時,它始終在主線程上,因爲主隊列上下文是唯一需要持久存儲的上下文。

非常感謝您的幫助。我確實在devforums.apple.com上發帖,所以如果你看過兩次,我很抱歉。

回答

0

我離線通過Tom Harrington進行了無害評論:「持久性商店不應該消失,除非你刪除它們(我假設你不這樣做)。」 '當然,當我拆除核心數據棧時(當用戶註銷時,我會這樣做)。)當我拆除堆棧時,我調用了我的根管理對象上下文(我唯一參考的)的重置,然後刪除持久存儲。但是,如果在子上下文中有未決的更改,它們將傳播到我現在持久存儲的根上下文,導致保存時崩潰。由於父母情況爲什麼不跟蹤他們的孩子,我不想跟蹤他們。相反,我只是在調用保存之前確認是否有父上下文或持久存儲協調器(至少有一個存儲)。

1

基本上有兩個地方看。

首先,檢查當您第一次將持久存儲添加到核心數據堆棧時會發生什麼。如果您使用的是Apple模板,那將會出現在應用程序委託中,但通常在應用程序初始化的某個地方存在對

的調用

addPersistentStoreWithType:configuration:URL:options:error:。其次,當你提到後臺線程,並且因爲你正在向你的方法傳遞一個託管對象上下文,你可能會有子上下文。檢查您創建時是否已正確指定了有效的父上下文或商店協調員到子上下文。

+0

感謝蒙迪。核心數據堆棧構建得很好(如果我在構建堆棧時將持久性存儲顯式設置爲零,應用幾乎會立即崩潰)。對於我的後臺上下文,那些總是在實例化時立即設置他們的parentContext。 – kalperin

0

不幸的是,這個錯誤是不明確的。我在使用配置時看到了它,並且在配置名稱中存在拼寫錯誤,或者在模型中沒有配置時傳入配置名稱的情況。

因此,我的第一行測試將是看你的核心數據堆棧創建代碼。你可以把這個添加到你的問題中,以便我們看看它嗎?

+0

謝謝Marcus。我知道我的堆棧是正確構建的,因爲如果我在構建堆棧時將持久存儲設置爲零,應用幾乎會立即崩潰。 – kalperin

+0

設置錯誤的配置與將其設置爲nil不同。配置錯字將在稍後顯示,而不是立即顯示。 –

+0

我聽到你的說法(「設置錯誤與設置爲零不一樣」),這只是一個快速的方法,讓我看看如果我癱瘓了堆棧設置會發生什麼。 – kalperin

相關問題