2017-05-04 52 views
0

我有一個具有兩種配置的DataModel。一個用於預加載數據,另一個用於用戶數據。 首次啓動預加載SQLLite數據庫被複制到文檔文件夾。用戶數據數據庫由ApplicationSupport目錄中的核心數據創建。到目前爲止一切正常。但現在的問題是:如果是第一次啓動,即使調用saveContext()方法,也不會保存任何內容。所有用戶數據在下次應用開始時都消失了。但它不是第一個開始,一切正常,所有的用戶數據都在下一個應用程序開始。有沒有人知道問題是什麼?在這裏我的核心數據堆棧:核心數據在第一次啓動時將數據保存到錯誤的數據庫中

lazy var persistentContainer: NSPersistentContainer = { 
     let container = NSPersistentContainer(name: "CoreData_App") 

     container.persistentStoreDescriptions[0].configuration = "PreloadData" 
     container.persistentStoreDescriptions[0].url = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("PreloadData.sqlite") 

     let userStoreDescription = NSPersistentStoreDescription(url: FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first!.appendingPathComponent("UserData.sqlite")) 
     userStoreDescription.configuration = "UserData" 

     container.persistentStoreDescriptions.append(userStoreDescription) 


     container.loadPersistentStores(completionHandler: { (storeDescription, error) in 
      if let error = error as NSError? { 
       fatalError("Unresolved error \(error), \(error.userInfo)") 
      } 
     }) 
     return container 
    }() 

    // MARK: - Core Data Saving support 

    func saveContext() { 
     let context = persistentContainer.viewContext 
     if context.hasChanges { 
      do { 
       try context.save() 
      } catch { 
       let nserror = error as NSError 
       fatalError("Unresolved error \(nserror), \(nserror.userInfo)") 
      } 
     } 
    } 

編輯 大量的測試後,我發現數據被存儲在第一次啓動預加載數據庫,並在第二次開始就正確的用戶資料庫。但我想在用戶數據庫的第一次啓動時保存數據。在這裏,我保存數據的代碼:

@IBAction func pressedFavoriteButton(_ sender: UIButton) { 
 
     if userRating == nil { 
 
      let rating = UserRating(context: DataController.sharedInstance.persistentContainer.viewContext) 
 
      rating.entryID = (entry?.id)! 
 
      userRating = rating 
 
     } 
 

 
     apiHandler.sendRequest(.POST) { (response, error) in 
 
      if let error = error { 
 
       print(error.localizedDescription) 
 
       return 
 
      } 
 
      DispatchQueue.main.async { 
 
       self.userRating?.isFavorite = !self.favoriteButton.isSelected 
 
       self.favoriteButton.isSelected = !self.favoriteButton.isSelected 
 
       
 
       DataController.sharedInstance.saveContext() 
 
      } 
 
     } 
 
    }

+0

您必須正確初始化核心數據堆棧。請分享您的代碼。 – Adam

+0

我不知道問題出在哪裏,所以很難知道我應該分享什麼。但是我現在已經將我的核心數據堆棧的代碼添加到問題中了。 – Lumpi01

+0

您的項目中使用了哪個版本的Swift? – Mannopson

回答

0

首先讓我們來設置正確的商店,

let preloadDataStoreDescription = NSPersistentStoreDescription(url: FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!.appendingPathComponent("PreloadData.sqlite")) 

let userStoreDescription = NSPersistentStoreDescription(url: FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first!.appendingPathComponent("UserData.sqlite")) 

    userStoreDescription.configuration = "UserData" 
preloadDataStoreDescription.configuration = "PreloadData" 

container.persistentStoreDescriptions = [preloadDataStoreDescription, userStoreDescription] 

既然你有2個數據庫,這取決於你存儲什麼實體。

如果實體屬於預加載配置,它將存儲在預加載數據庫中,否則它將存儲在用戶數據庫中。

P.S. 您還可以進一步調試使用標誌

-com.apple.CoreData.SQLDebug 1 

在編輯方案>參數>參數傳遞上推出

另外,我建議不要如果不是真的需要設計2個數據庫,複雜化。

+0

感謝您的更好的設置代碼。是的,我知道如何工作配置,但問題是它將所有數據存儲在預加載數據庫(也是不在預加載配置中的實體)在第一次啓動。第一次啓動後一切正常。 – Lumpi01

+0

你可以顯示代碼保存數據的位置嗎? – jarora

+0

好的,我已將它們添加到 – Lumpi01