【问题标题】:Core data: Failed to load model核心数据:加载模型失败
【发布时间】:2017-07-22 01:55:28
【问题描述】:

我是核心数据的新手。

我正在尝试做的事情:我正在尝试创建一个 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)
}

【问题讨论】:

  • 第一个错误表示模型文件SimpleFramework.momd 丢失或超出范围。
  • 这个问题你解决了吗?我有同样的错误,我不知道如何解决它。
  • 也在寻找答案,你解决了吗?
  • @Ashiq 您的核心数据模型文件位于您的应用程序或框架内的什么位置?
  • @WaelShowair 它在应用程序内部。

标签: swift core-data swift3


【解决方案1】:

将模型文件名显式传递给 Core Data 堆栈以进行初始化,并确保使用 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

【讨论】:

  • 这不起作用。我在所有警卫声明中都收到错误消息。我尝试重写代码,但它抛出“一行上的连续语句必须用 ; 分隔”。
  • 如果它包含在目标中并且命名正确(三重检查!),该代码适用于我们所有的产品。也许用更多信息更新问题(显示模型 aso。)
  • guard let modelURL = Bundle(for: type(of: self)).url(forResource: momdName, withExtension:"momd") else { fatalError("Error loading model from bundle") } 对我有用,因为我在动态库中使用模型,因此 bundle 不再是主要的。
  • 即使模型在预期的目标中并且在创建 NSPersistentContainer 时名称正确,我仍然得到错误。但这为我解决了!谢谢。
  • 当我将模型移出主应用程序并进入框架时,我看到了这个错误,这个答案为我修复了它。谢谢:)
【解决方案2】:

我遇到了这个问题,当我输入了错误的型号名称时 - 它应该是型号名称,而不是项目名称(见屏幕截图)

【讨论】:

  • 我的项目名称和xcdatamodeld的名称在我的应用程序中是一样的。
  • 就我而言,名称不同。在所有地方设置相同的名称解决了这个问题。我不能尽可能多地对此进行投票(带有绿色箭头的图片是无价的)。
  • 这两个对我来说是一样的,还是不行。
  • 为什么持久化容器名称会和模型名称一样?如果您有多个模型怎么办?
  • 太棒了,这对我有用!我一直在努力弄清楚我哪里出错了,最后偶然发现了这个答案。
【解决方案3】:

就我而言,由于某种原因,我的项目工作区中缺少 DataModel.xcdatamodeld

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

【讨论】:

    【解决方案4】:

    你传递给 NSPersistentContainer 初始化器的字符串:

    NSPersistentContainer(name: "CoreData")
    

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

    CoreData.xcdatamodeld
    

    【讨论】:

      【解决方案5】:

      我的问题出在我的 .podspec 文件上。您应该在正在创建的 pod 中包含 xcdatamodeld 扩展。

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

      【讨论】:

        猜你喜欢
        • 2019-06-18
        • 2021-10-31
        • 2011-06-23
        • 1970-01-01
        • 1970-01-01
        • 2017-08-29
        • 2011-10-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多