核心数据:无法加载模型

时间:2017-03-02 11:07:06

标签: swift core-data swift3

我是核心数据的新手。

我想要做的事情:我正在尝试创建一个cocoatouch框架,其中包含一个应用程序,用于添加员工详细信息并在表格视图中显示它们。这样我就可以将这个框架添加到我的主项目中以独立工作。

我面临的问题:框架工作构建没有任何错误。我已经将swift 3的核心数据堆栈添加到了框架中。但是当我运行主项目时,框架加载日志的那一刻显示“无法加载名为Simple framework的模型”,“fetch failed”和“employee必须具有有效的实体描述”。我在框架中使用的代码如下所示:

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.

5 个答案:

答案 0 :(得分:68)

我有这个问题,当我的模型名称错误时 - 它应该是模型名称,而不是项目(参见屏幕截图)enter image description here

答案 1 :(得分:24)

明确地将模型文件名传递给Core Data堆栈进行初始化,并确保使用$data[] = [ "ean" => $sku, "condition" => "100", "listing_price" => $price, "minimum_price" => $price, "amount" => 9, "delivery_time" => "b", "location" => "DE" ]; 从正确的捆绑包(测试包,app bundle ...)加载它:

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

答案 2 :(得分:1)

在我的情况下,由于某种原因,我的项目工作区中缺少DataModel.xcdatamodeld

首先,我尝试创建新的DataModle.xcdatamodeld并重新创建数据模型,但发生了同样的错误。那是我意识到Original DataModel.xcdatamodeld仍在根目录中的时候。我通过在项目导航器中右键单击我的项目并选择"Add files to "Project"..."来修复此问题,然后添加了旧数据模型并删除了我的新数据模型。最后,我彻底清理,运行我的项目,它解决了问题。

答案 3 :(得分:1)

您传递给NSPersistentContainer初始化程序的字符串:

NSPersistentContainer(name: "CoreData")

需要匹配您的Xcode项目中数据模型文件的文件名:

CoreData.xcdatamodeld

答案 4 :(得分:0)

我的问题出在我的 .podspec 文件中。您应该在要创建的Pod中包含xcdatamodeld扩展名。

s.resources =“ myprojectfolder / ** / *。{png,jpeg,jpg,storyboard,xib,xcassets,xcdatamodeld}”