Основные данные: Не удалось загрузить модель

Я новичок в основных данных.

Что я пытаюсь сделать: я пытаюсь создать каркас 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

У меня была эта проблема, когда у меня было неправильное название модели - это должно быть имя модели, а не проекты (см. Снимок экрана) enter image description here

Ответ 2

Явно передайте имя файла модели в стек 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:

Ответ 3

В моем случае по какой-то причине DataModel.xcdatamodeld пропал из моей рабочей области проекта.

Сначала я попытался создать новый DataModle.xcdatamodeld и воссоздать модель данных, но произошла DataModle.xcdatamodeld и та же ошибка. Вот когда я понял, что Original DataModel.xcdatamodeld все еще находится в корневом каталоге. Я исправил это, просто щелкнув правой кнопкой мыши мой проект в моем навигаторе проектов и выбрав "Add files to "Project"...", затем я добавил свою старую модель данных и удалил новую модель данных. Наконец, я убирал, бегал по моему проекту и исправлял проблему.

Ответ 4

Строка, которую вы передаете инициализатору NSPersistentContainer:

NSPersistentContainer(name: "CoreData")

должен соответствовать filefame файла модели данных в вашем проекте XCode:

CoreData.xcdatamodeld