2017-03-02 155 views
15

我是核心數據的新手。核心數據:加載模型失敗

我在做什麼:我正在嘗試創建一個應用程序添加員工詳細信息並將其顯示在表視圖中的cocoatouch框架。所以我可以將此框架添加到我的主項目中以獨立工作。

我面臨的問題:框架工作生成沒有任何錯誤。我已經將swift 3的核心數據棧添加到了框架中。但是,當我運行主項目時,框架加載日誌顯示「未能加載模型名爲簡單框架」,「獲取失敗」和「員工必須具有有效的實體描述」。在如下圖所示,我的框架已經使用的代碼:

public class CoreDataStack { 
    public static let sharedInstance = CoreDataStack() 

     lazy var persistentContainer: NSPersistentContainer = { 
     let container = NSPersistentContainer(name: "SimpleFramework") 
     container.loadPersistentStores(completionHandler: { (storeDescription, error) in 
      if let error = error { 
       fatalError("Unresolved error \(error), \(error)") 
      } 
     }) 
     return container 
    }() 

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





@IBAction func addEmployee(_ sender: Any) { 

    //To save the data 
    let context = CoreDataStack.sharedInstance.persistentContainer.viewContext 
    let employee = Employee(context: context) 
    employee.employeeName = nameTextField.text 
    employee.employeeAge = Int16(ageTextField.text!)! 
    employee.hasVehicle = hasVehicle.isOn 
    CoreDataStack.sharedInstance.saveContext() 
    navigationController!.popViewController(animated: true) 

} 


@IBAction func addEmployee(_ sender: Any) { 

    //To save the data 
    let context = CoreDataStack.sharedInstance.persistentContainer.viewContext 
    let employee = Employee(context: context) 
    employee.employeeName = nameTextField.text 
    employee.employeeAge = Int16(ageTextField.text!)! 
    employee.hasVehicle = hasVehicle.isOn 
    CoreDataStack.sharedInstance.saveContext() 
    navigationController!.popViewController(animated: true) 

} 

This is a screenshot of the console log.

+1

第一個錯誤表示模型文件SimpleFramework.momd丟失或超出範圍。 – vadian

+1

你解決了這個問題嗎?我有同樣的錯誤,我不知道如何解決它。 – Blehi

+1

也在尋找答案,你解決了嗎? – KostiaZzz

回答

7

明確地傳遞模型文件名核心數據堆棧初始化,並確保,它是從右束裝在時刻(測試包,應用程序包...)通過使用Bundle(for: type(of: self))

//... 
let momdName = "SimpleFramework" //pass this as a parameter 
//... 

guard let modelURL = Bundle(for: type(of: self)).url(forResource: momdName, withExtension:"momd") else { 
     fatalError("Error loading model from bundle") 
} 

guard let mom = NSManagedObjectModel(contentsOf: modelURL) else { 
    fatalError("Error initializing mom from: \(modelURL)") 
} 

persistentContainer = NSPersistentContainer(name: momdName, managedObjectModel: mom) 

//... 

編輯:

還要確保,在SimpleFramework.xcdatamodeld被添加到使用的目標Target Membership

+0

這不起作用。我在所有警衛聲明中遇到錯誤。我試着重寫代碼,但它會拋出「連續的語句在一行之間必須以...分隔」。 –

+0

查看更新的答案。 – shallowThought

+0

是的,我已經仔細檢查過。 –

34

我有這個問題,當我有錯型號名稱 - 它應該我型號名稱,而不是項目(看到屏幕截圖)enter image description here

+2

我的項目名稱和xcdatamodeld的名稱在我的應用程序中是相同的。 –

+0

在我的情況下,名稱是不同的。在整個地方設置相同的名字解決了這個問題。我不能多次投票,因爲它應得的(帶有綠色箭頭的圖片是無價的)。 –

+2

這兩個對我來說是一樣的,它仍然沒有工作。 – horseshoe7

0

在我的情況下,出於某種原因,DataModel.xcdatamodeld從我的項目工作區中失蹤。

首先,我嘗試創建一個新的DataModle.xcdatamodeld並重新創建數據模型,但發生了同樣的錯誤。那是當我意識到Original DataModel.xcdatamodeld仍在根目錄中。我通過在項目導航器中右鍵單擊我的項目並選擇"Add files to "Project"..."來解決此問題,然後添加了舊數據模型並刪除了我的新數據模型。最後,我清理乾淨了,運行了我的項目並解決了問題。