web-dev-qa-db-fra.com

executeFetchRequest: error: Une demande d'extraction doit avoir une entité

J'ai eu un projet qui fonctionnait bien. "Core Data" a été vérifié et le modèle de données a été configuré. J'ai seulement commencé à ajouter quelques entités et propriétés ce soir. Lorsque j'essaie de lancer mon application maintenant, elle ne se charge même pas. Il se bloque juste sur moi.

Voici l'erreur:

'NSInvalidArgumentException', reason: 'executeFetchRequest:error: A fetch request must have an entity.'

J'ai vraiment peur parce que je n'ai pas de sauvegarde de cela et si je ne peux pas le faire fonctionner, je ne sais pas ce que je vais faire. :)

Merci d'avance!

EDIT: J'en ai marre de mes données, alors je viens de copier un nouveau xcdatamodel vierge dans mon projet et je vais recommencer à zéro. Merci pour l'aide!

20
sudo rm -rf

Il semblait que mes données avaient été corrompues. J'ai donc supprimé mon modèle de données et la base de données dans le simulateur iPhone, puis j'ai tout recommencé.

11
sudo rm -rf

Mon problème est que je n'ai pas utilisé le même nom pour Entity et Class. La solution triviale pour y remédier consiste à leur donner le même nom.

21
syshen

Si vous utilisezMagicalRecoredwithSwift:

Assurez-vous d'utiliser la directive @objc dans la sous-classe Swift NSManagedObject pour rendre la classe accessible au code Objective-C à partir de la bibliothèque MagicalRecord.

@objc(MyEntity)
class MyEntity: NSManagedObject {
    @NSManaged var myAttribute: Int16
}
16

Après avoir cherché partout une solution, ce qui a été résolu pour moi était de faire un Clean/Build dans Xcode.

Produit-> Nettoyer, Produit-> Construire, puis essayez de l'exécuter.

15
Jake Stoeffler

J'ai eu la même erreur.

Pour moi, c'est parce que j'ai ajouté une nouvelle version du modèle, mais que je ne l'ai pas définie comme "version actuelle". Moi insouciant! Pour résoudre ce problème, sélectionnez xcdatamodel, cliquez sur Conception> Modèle de données> Définir la version actuelle. Le fichier xcdatamodel aura alors une coche verte.

Des espoirs qui aident.

11
samwize

Assurez-vous également que votre fichier .xcdatamodeld se trouve dans la phase "Copier les ressources du paquet" de vos phases de construction.

7
uff da

Vérifier si,

  • l'entité est présente dans le fichier xcdatamodel.
  • nom d'entité utilisé sont les mêmes.
6
aToz

Voici ce qui l'a corrigé pour moi:

Lors de la conversion en Swift 3, Xcode me renvoyait une erreur lors de la déclaration d'une nouvelle variable NSFetchRequest, indiquant qu'il lui fallait un type. Après avoir ajouté le type, j'ai fait ce que quelqu'un d'autre aurait supposé; si la demande est tapée, pourquoi spécifier un nom d'entité? Alors, je l'ai enlevé.

C'était en fait mon erreur.

Swift 2.2:

let request = NSFetchRequest(entityName: "MyEntity")

Quand je me suis converti pour la première fois à Swift 3:

let request = NSFetchRequest<MyEntity>()

Cela me donnait une erreur. J'ai fini avec ceci:

let request = NSFetchRequest<MyEntity>(entityName: "MyEntity")

Et tout fonctionne bien. Personnellement, je ne sais pas pourquoi il faut spécifier un nom d’entité si vous tapez la demande. Peut-être qu'ils vont le mettre à jour à un moment donné (j'espère)

3
Simon Germain

Si vous utilisez la nouvelle syntaxe de pile de Swift 3 et Core Data:

var persistentContainer: NSPersistentContainer = {
    let container = NSPersistentContainer(name: "MyAppModel")
    container.loadPersistentStores(completionHandler: {
        (storeDescription, error) in
        if let error = error as NSError? {
            fatalError("Unresolved error \(error), \(error.userInfo)")
        } else {
            print(storeDescription)
        }
    })
    return container
}()

Ensuite, vous devriez utiliser cette syntaxe d'extraction:

let request: NSFetchRequest<Client> = Client.fetchRequest()

J'ai eu cette erreur lors de la première extraction après le lancement de l'application lors de l'utilisation de différentes variantes:

let request: NSFetchRequest<NSFetchRequestResult> = Client.fetchRequest()

let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Client")
1
William T.

J'ai construit propre et cela n'a pas résolu le problème. Ensuite, j'ai supprimé l'application, ce qui n'a pas résolu le problème. Ensuite, j'ai construit propre et supprimé l'application AT LE MÊME TEMPS, et cela a été corrigé.

1
Sam Grossberg

Vous pouvez également utiliser la méthode de définition de CoraData ... Faites quelque chose comme ça ...

Sur votre CustomCoreDataManager.m

importer la méthode d'initialisation d'appel "ObjectiveRecord.h" comme ceci

(instancetype) init {

self = [super init];

si (soi-même) {

[[CoreDataManager sharedManager] setModelName: @ "YourModelName"]; }

retourner soi-même; }

J'espère que cela aide quelqu'un ...

0
John

Je pense que la question/le problème initial, ainsi que le problème que la plupart de ces réponses résolvent (de différentes manières), sont simplement simples:

Chaque fois que vous modifiez vos données de base (par exemple, en ajoutant une entité comme vous le mentionnez), vous devez soit supprimer toutes les données existantes (si vous n'avez pas encore publié votre application), soit ajouter une nouvelle version à votre modèle.

Je pensais que je posterais cette réponse, même s’il s’agit d’une question plus ancienne, car cette réponse semble assez évidente et n’a jusqu’à présent été abordée dans aucune des questions ou commentaires que j'ai lus ci-dessus.

0
eselk

J'ai d'abord téléchargé les données de l'application via l'Organisateur (pour voir ce qui se passait) et j'ai remarqué qu'elle m'offrait de l'enregistrer sous un nom de projet précédent. Cela m'a rendu perplexe. Alors je suis sorti de XCode 4.6.1, j'ai supprimé l'application (et ses données) de mon iPhone et je suis revenu.

Cette fois, j'ai eu une erreur en disant Cannot create an NSPersistentStoreCoordinator with a nil model. J'ai donc examiné le fichier AppDelegate.m et modifié la variable URLForResource dans la méthode - (NSPersistentStoreCoordinator *) persistentStoreCoodinator. Il a été défini sur le nom de mon application et je l'ai changé en "Modèle" afin qu'il corresponde au nom de mon modèle.xcdatamodeld.
Ça marche maintenant.

0
gone

Ajoutez juste le même problème. J'ai copié toutes mes entités. Supprimé le modèle de données, recréé un modèle vide et collé les entités dans le nouveau modèle de données. Résolu mon problème.

0
CodeFlakes

J'ai rencontré le même problème. En fait, j'appelais MyEnty au lieu de MyEntity, veuillez donc vérifier à nouveau les noms que vous avez donnés à vos entités et les appeler de la même manière et vérifier également si vous appelez les mêmes attributs que ceux que vous avez définis, comme name.

0
Xcodian Solangi

Peut-être essayez-vous de charger une base de données à partir d'un bundle différent/incorrect? Par exemple de ou dans un cadre?

J'ai eu ce problème et résolu en chargeant la base de données à partir de la bundle du cadre associé. Et puis tout a bien fonctionné !!

Swift 4 + MagicalRecord:

let frameworkBundle = Bundle(for: AClassFromTheFramework.self)
let managedObjectModel = NSManagedObjectModel.mergedModel(from: [frameworkBundle])
MagicalRecord.setShouldAutoCreateManagedObjectModel(false)
NSManagedObjectModel.mr_setDefaultManagedObjectModel(managedObjectModel)
MagicalRecord.setupCoreDataStack(withAutoMigratingSqliteStoreNamed: "db.sqlite")

Et le tour est joué!

0
Kevin Delord

Cela m'est arrivé lorsque je cherchais dans la mauvaise base de données. Mon application a 3 bases de données sqlite, et bien sûr 3 instances de ManagedObjectContext. Eh bien, je soumettais le mauvais ManagedObjectContext à une méthode en lui demandant d'interroger une table qui n'existait pas dans le ManagedObjectContext que j'ai soumis. Après avoir utilisé le correct ManagedObjectContext, tout était bon.

0
user3457292

Je suis tombé par hasard sur la même erreur précise lors de mes premiers pas dans Core Data (et iOS 11 et Swift 4). J'ai commencé un livre (la sixième édition était destinée à Swift 4 mais incluait vraisemblablement des éléments hérités du passé).

Comme suggéré dans le livre, mon code était le suivant:

let fetchRequest = NSFetchRequest<ReminderData>()
let entity = ReminderData.entity()
fetchRequest.entity = entity
do {
    let rows = try managedObjectContext.fetch(fetchRequest)
} catch {
    fatalError("Unresolved error")
}

Il s’est avéré que tout ce que j’ai tiré de ReminderData.entity() est nil. Vous ne savez pas si j'ai fait quelque chose de mal lors de la configuration du modèle de données ou ... Les documents d'Apple indiquent que NSManagedObject.entity() ne doit pas être remplacé?

En résumé, le fichier Codegen ReminderData+CoreDataProperties.Swift contenait la solution:

@nonobjc public class func fetchRequest() -> NSFetchRequest<ReminderData> {
    return NSFetchRequest<ReminderData>(entityName: "ReminderDB")
}

ce qui était tout ce que je devais utiliser pour me retrouver avec un NSFetchRequest correct, pas de bidouillage avec le NSEntityDescription, le problème est parti!

let fetchRequest = NSFetchRequest<ReminderData>(entityName: "ReminderDB")
do {
    let rows = try managedObjectContext.fetch(fetchRequest)
} catch {
    fatalError("Unresolved error")
}
0
Matthias