web-dev-qa-db-fra.com

Données de base: Impossible de charger le modèle

Je suis nouveau aux données de base.

Ce que j'essaie de faire: J'essaie de créer un framework cocoatouch qui dispose d'une application permettant d'ajouter des informations sur les employés et de les afficher sous forme de tableau. Pour que je puisse ajouter ce cadre à mon projet principal pour travailler de manière autonome.

Problèmes auxquels je suis confronté: Le travail sur cadre est construit sans erreur. J'ai ajouté la pile de données principale de Swift 3 au framework. Mais lorsque je lance le projet principal, le moment où la structure charge le journal, affiche "Échec du chargement du modèle nommé Structure simple", "récupération échouée" et "employé doit avoir une description d'entité valide". Le code que j'ai utilisé dans le cadre est le suivant: 

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.

21
Ashiq Sulaiman

J'ai eu ce problème, quand j'avais un mauvais nom de modèle - il faut me nommer les modèles, pas les projets (voir la capture d'écran) enter image description here

57
Dmitriy Yerchick

Passez explicitement le nom du fichier de modèles à la pile de données de base pour l'initialisation et assurez-vous qu'il est chargé à partir du bon ensemble à la fois (ensemble de test, ensemble d'application ...) à l'aide de 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)

//...

Modifier:

Assurez-vous également que le SimpleFramework.xcdatamodeld est ajouté aux cibles utilisées Target Membership:

 

18
shallowThought

Dans mon cas, pour une raison quelconque, le DataModel.xcdatamodeld a disparu de l'espace de travail de mon projet. 

J'ai d'abord essayé de créer un nouveau DataModle.xcdatamodeld et de recréer le modèle de données, mais la même erreur s'est produite. C'est quand j'ai réalisé que le Original DataModel.xcdatamodeld était toujours dans le répertoire racine. J'ai résolu ce problème en cliquant simplement avec le bouton droit de la souris sur mon projet dans le navigateur de projet et en sélectionnant "Add files to "Project"...", puis j'ai ajouté mon ancien modèle de données et supprimé mon nouveau modèle de données. Finalement, j'ai nettoyé durement, couru mon projet et résolu le problème. 

1
Alec Michel

La chaîne que vous transmettez à l'initialiseur NSPersistentContainer:

NSPersistentContainer(name: "CoreData")

a besoin de correspondance le nom du fichier de modèle de données dans votre projet Xcode:

CoreData.xcdatamodeld
0
pkamb