2015-06-04 37 views
0

我在我現有的應用程序中添加了Today Extension,並設置了一個單獨的核心數據堆棧(重複使用用於爲主應用程序設置核心數據的相同代碼)。
當我運行Today擴展時,我的應用程序數據被刪除,就像設置Today核心數據堆棧刪除現有數據一樣。請參考下代碼返回persistentCoordinator今天擴展刪除sqlite中的數據

let options = [NSMigratePersistentStoresAutomaticallyOption:true, 
         NSInferMappingModelAutomaticallyOption:true, 
             NSSQLitePragmasOption:["journal_mode":"MEMORY"]] 

var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) 
      if coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: storeURL, options: options, error: &error) == nil { 

    NSLog("Unresolved error \(error)") 
      } 
      return coordinator 
+0

看來你的'storeurl'不正確,請確保它使用分組文件夾。你的函數'applicationDocumentsDirectory'應該返回groupPath,在你的情況下,似乎應用程序正在創建一個新的CoreData,而不是使用正確的。 – iphonic

+0

我正在使用共享組標識來設置核心數據。只有當我今天嘗試打開(獲取數據)並且主應用程序未被殺死時,數據纔會刪除。如果主應用程序被殺害今天工作正常,沒有數據被刪除。 –

+0

你爲什麼將'journal_mode'設置爲'MEMORY'? SQLite文檔說這個[「...保存磁盤I/O但犧牲數據庫的安全性和完整性。」](https://sqlite.org/pragma.html) –

回答

0

經過大量的調試,以及閱讀Google搜索博客和文檔,我覺得這個問題是因爲對NSManagedObjectModelmergedModelFromBundles方法。
我有多個.xcdatamodels在我的包和設置核心數據堆棧期間,我使用上述方法合併單個模型。
作爲爲今日設置的核心數據堆棧,從該方法返回的模型與用於創建sqlite存儲的Main應用程序不同,因此返回的持久存儲區不同且需要遷移。
但是,遷移經常失敗並刪除我的.sqlite(由主應用程序設置),並設置了新的sqlite。
我發現的一個解決方案是使用
NSManagedObjectModel(contentsOfURL: modelPathURL!)
獲取託管對象模型的方法,其中url是捆綁包中momd文件的路徑url。
參見:Core Data Migration Guide

不過,我還沒有想通,如何給三種不同的xcdatamodelids單路徑URL以及如何遷移,如果他們在未來的任何xcdatamodel變化路徑URL。
所以,目前我已經合併了三個xcdatamodels到我的包中的單個xcdatamodel來解決這個問題。