核心数据:无法加载模型

Ash*_*man 23 core-data swift 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)
}
Run Code Online (Sandbox Code Playgroud)

这是控制台日志的屏幕截图.

小智 79

我有这个问题,当我的模型名称错误时 - 它应该是模型名称,而不是项目(参见屏幕截图)在此输入图像描述

  • 我的项目名称和xcdatamodeld的名称在我的应用程序中是相同的. (3认同)
  • 就我而言,名字是不同的。在各处设置相同的名称可以解决此问题。我不能对此进行多次投票(带有绿色箭头的图片是无价的)。 (2认同)
  • 这两个对我来说是一样的,但它仍然没有用. (2认同)

sha*_*ght 34

将模型文件名显式传递给Core Data堆栈进行初始化,并确保通过使用Bundle(for: type(of: self))以下方式从正确的bundle(测试包,app bundle ...)加载它:

//...
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)

//...
Run Code Online (Sandbox Code Playgroud)

编辑:

还要确保将SimpleFramework.xcdatamodeld已添加到已使用的目标中Target Membership:

  • ```guard let modelURL = Bundle(for: type(of: self)).url(forResource: momdName, withExtension:"momd") else { fatalError("Error loading model from bundle") }```对我来说,因为我在动态库中使用模型,因此 bundle 不再是主要的。 (2认同)

pka*_*amb 6

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

NSPersistentContainer(name: "CoreData")
Run Code Online (Sandbox Code Playgroud)

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

CoreData.xcdatamodeld
Run Code Online (Sandbox Code Playgroud)


Lev*_*dze 6

如果您想在动态框架中使用 CoreData,则必须子类化NSPersistentContainer并使用它而不是NSPersistentContainer.

class PersistentContainer: NSPersistentContainer { }

//...

lazy var container: PersistentContainer = {
    let result = PersistentContainer(name: "Your xcdatamodeld file name here")
    result.loadPersistentStores { (storeDescription, error) in
        if let error = error {
            print(error.localizedDescription)
        }
    }
    return result
}()
Run Code Online (Sandbox Code Playgroud)