2017-03-04 192 views
3

我看到這個標題的幾個崩潰報告:核心數據崩潰 - 該NSPersistentStoreCoordinator沒有持久性存儲(損壞的文件)

的NSPersistentStoreCoordinator沒有持久性存儲(損壞的文件)。它不能執行保存操作。我添加了持久性存儲協調代碼是在這裏:

NSURL *applicationDocumentsDirectory = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask].lastObject; 

    NSURL *storeURL = [applicationDocumentsDirectory URLByAppendingPathComponent:@"myDatabase.sqlite"]; 

    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"myDataModel" withExtension:@"momd"]; 

    NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; 

    NSDictionary *storeOptions = @{NSInferMappingModelAutomaticallyOption:@YES, 
            NSMigratePersistentStoresAutomaticallyOption:@YES, 
            NSSQLitePragmasOption:@{@"synchronous": @"OFF"}}; 

    // Create the persistent store. 
    self.persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel]; 
    NSError *error = nil; 
    if (![self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
                 configuration:nil 
                   URL:storeURL 
                  options:storeOptions 
                   error:&error]) 
    { 

    } 

我已經登錄所散發出來的「addPersistentStoreWithType」調用的錯誤,它是:

NSCocoaErrorDomain 259 
NSSQLiteErrorDomain = 11; 
NSUnderlyingException = "Fatal error. The database at <path> is corrupted. SQLite Error code:11, 'database disk image is malformed' 

我承擔這意味着核心數據庫在不可恢復的情況下受到損害。是這樣嗎?我有一個脫離核心數據庫並從我的服務器重新填充的備份計劃,但我想知道它是否絕對無法恢復,如果有任何問題,我可以做,找出原因可能發生的原因。

一些額外的信息:

的崩潰報告指出RAM可用3-6%,磁盤可用57%,運行iOS 10.開始看到這些報告的應用程序的版本較新的模型手機也是第一個版本作爲其中的一部分,它有一個輕量級的核心數據遷移,我不確定這是否有所作爲。我知道有98%的用戶成功升級到該版本,並沒有任何問題進行遷移。這是來自報告的堆棧跟蹤。儘管它說的是「device_locked」,但我知道,無論何時我嘗試保存到持久存儲區,即使用戶在應用程序中,都會發生崩潰。

enter image description here

+0

「NSSQLitePragmasOption」選項的目標是什麼?@ {@「synchronous」:@「OFF」}'? –

+0

寫入磁盤的速度。你認爲這可能會導致腐敗? – haplo1384

+0

絕對。從http://sqlite.org/pragma.html#pragma_synchronous:「如果運行SQLite的應用程序崩潰,數據將是安全的,但數據庫可能會損壞我感謝喬恩,」但我是「應用程序運行sqlite」我的 –

回答

1
  1. 看看你是否可以不同步編譯獲得可接受的性能。如果它對你沒什麼幫助,那麼就沒有必要抓住這個機會。

  2. 我看到你已經有了能夠有效檢測到事情已經過去的代碼......當你點擊它時,你可以通過簡單地刪除SHM和WAL文件來看到會發生什麼。這可能只是那些搞砸了。如果確實能夠從服務器數據恢復,並且確實很少發生,那麼按照您所說的刪除整個數據庫(如果#2不起作用)就可以接受。

  3. 確保您正在主線程上創建存儲,並確保遷移正在主線程上進行。

+0

我試圖沒有同步標誌,並驗證主線程創建/遷移。 – haplo1384

0

我有同樣的問題,我的解決方案是刪除應用程序,並再次安裝它,因爲數據庫中的修改。

相關問題