2017-05-30 3 views
0

J'ai un projet-cadre et d'obtenir cette erreur étrange lorsque je tente de tester l'unité mes cours. ici est le code proposé par Andrew Bancroft pour obtenir en mémoire NSManagedObjectContextSwift 3 Core Data NSInternalInconsistencyException entityForName n'a pas pu localiser une entité nommée Foo dans ce modèle

func setUpInMemoryManagedObjectContext() -> NSManagedObjectContext { 
    let managedObjectModel = NSManagedObjectModel.mergedModel(from: [Bundle.main])! 
    let persistentStoreCoordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel) 

    do { 
     try persistentStoreCoordinator.addPersistentStore(ofType: NSInMemoryStoreType, configurationName: nil, at: nil, options: nil) 
    } catch { 
     print("Adding in-memory persistent store failed") 
    } 

    let managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType) 
    managedObjectContext.persistentStoreCoordinator = persistentStoreCoordinator 

    return managedObjectContext 
} 

Mais chaque fois que je tente d'insérer un objet (ou toute autre opération db) par ce code

let newLocationMO = NSEntityDescription.insertNewObject(forEntityName: table, into: context) as! LocationMO 

Il se bloque avec l'erreur mentionné dans Titre. J'ai aussi essayé de tester avec un contexte réel, donc j'importe mon framework dans un projet temporaire et récupère le contexte du code généré automatiquement par AppDelegate mais il se bloque avec la même erreur que s'il ne voit pas ma définition .xcdatamodeld.

Note: J'ai vérifié toutes les fautes de frappe et qu'aucun fichier est manquant.

Peut-être il est interdit d'avoir des données de base dans le projet-cadre? Tout lien ou exemple d'utilisation de données de base dans un projet-cadre est très apprécié.

Répondre

1

Vous pouvez utiliser les données de base dans un cadre, mais vous devez vous assurer que votre code sait que ce soit dans un cadre. La source la plus probable de problème est cette ligne:

let managedObjectModel = NSManagedObjectModel.mergedModel(from: [Bundle.main])! 

Si vous êtes dans un cadre, votre modèle n'est pas dans le faisceau principal. Vous lui dites de regarder au mauvais endroit, donc il ne trouve pas le fichier modèle.

Vous voulez probablement changer cela à Bundle(for: type(of:self)) afin que vous regarderez dans le même paquet contenant les classes cadres.

+0

Merci pour la réponse, Tom semble qu'il résout le problème avec la création de contexte, mais maintenant il y a un autre problème. Il dit: CoreData: avertissement: Impossible de charger la classe nommée 'MyFramework.MyClass' pour l'entité 'MyClass'. Classe non trouvée, utilisant NSManagedObject par défaut. Impossible de convertir la valeur de type 'NSManagedObject_MyClass_' en 'MyFramework.MyClass' pour quelle raison? MyClass est généré automatiquement par la classe publique – Vilen

+0

ok après de nombreuses tentatives de faire la même chose, c'est-à-dire supprimer le module xcdatamodeld puis recréer les classes qu'il a commencé à tester. mais ne peut toujours pas utiliser mon cadre à l'intérieur du projet réel ressemble à ne pas voir xcdatamodeld. – Vilen