Ответ 1
У меня была эта проблема, когда у меня было неправильное название модели - это должно быть имя модели, а не проекты (см. Снимок экрана)
Я новичок в основных данных.
Что я пытаюсь сделать: я пытаюсь создать каркас 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)
}
У меня была эта проблема, когда у меня было неправильное название модели - это должно быть имя модели, а не проекты (см. Снимок экрана)
Явно передайте имя файла модели в стек 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
:
В моем случае по какой-то причине DataModel.xcdatamodeld
пропал из моей рабочей области проекта.
Сначала я попытался создать новый DataModle.xcdatamodeld
и воссоздать модель данных, но произошла DataModle.xcdatamodeld
и та же ошибка. Вот когда я понял, что Original DataModel.xcdatamodeld
все еще находится в корневом каталоге. Я исправил это, просто щелкнув правой кнопкой мыши мой проект в моем навигаторе проектов и выбрав "Add files to "Project"..."
, затем я добавил свою старую модель данных и удалил новую модель данных. Наконец, я убирал, бегал по моему проекту и исправлял проблему.
Строка, которую вы передаете инициализатору NSPersistentContainer:
NSPersistentContainer(name: "CoreData")
должен соответствовать filefame файла модели данных в вашем проекте XCode:
CoreData.xcdatamodeld