2010-11-12 5 views
19

Ich hatte ein Projekt, das einwandfrei funktionierte. Es wurden "Core Data" überprüft und das Datenmodell wurde eingerichtet. Ich habe heute erst ein paar Entitäten und Eigenschaften hinzugefügt. Wenn ich versuche, meine App jetzt auszuführen, wird sie nicht einmal geladen. Es stürzt einfach auf mich ab.executeFetchRequest: Fehler: Eine Abrufanforderung muss eine Entität haben

Hier ist der Fehler:

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

Ich habe wirklich Angst, weil ich eine Sicherungskopie dieses nicht haben und wenn ich es nicht bekommen kann arbeiten, weiß ich nicht, was ich machen. :)

Vielen Dank im Voraus!

EDIT: Ich hatte meine Daten satt, also habe ich nur ein neues leeres xcdatamodel zu meinem Projekt kopiert und ich werde neu anfangen. Danke für die Hilfe!

+0

Sie müssen die relevanten Teile des Codes veröffentlichen. – Yuji

+0

Welche Teile möchten Sie? –

+0

Der Code um Ihren executeFetchRequest: error: call wäre sehr hilfreich, um zu verstehen, was Ihr Problem ist. –

Antwort

11

Es schien, als ob meine Daten beschädigt wurden, also löschte ich mein Datenmodell und die Datenbank im iPhone Simulator und begann frisch.

+0

yeah, vergessen Sie nicht, die App aus dem löschen Simulator! – Nuthatch

11

Ich hatte den gleichen Fehler.

Für mich ist es, weil ich eine neue Modellversion hinzugefügt habe, aber ich habe es nicht als "aktuelle Version" festgelegt. Unvorsichtige mich! Um das Problem zu beheben, wählen Sie das xcdatamodel aus und klicken Sie auf Design> Datenmodell> Aktuelle Version festlegen. Die Datei xcdatamodel hat dann ein grünes Häkchen.

Hoffnungen, die hilft.

+0

danke - ich habe auch eine davon. –

15

Nach der Suche nach einer Lösung, was reparierte es für mich war ein Clean/Build in Xcode.

Produkt-> Reinigen, Produkt-> Build, dann versuchen Sie es auszuführen.

+0

Ich löschte sowohl die App im Simulator, als auch Clean/Build. Das gleiche Problem, das hat das Problem nicht gelöst. Ich möchte ein komplexes Datenmodell nicht löschen und neu erstellen. Also, wie kann man das Problem zerstörungsfrei beheben? –

+0

Warum die Down-Abstimmung, @JayImerman? Es tut mir leid, dass meine Antwort nicht für Sie funktioniert hat, aber das bedeutet nicht, dass Sie es abstimmen sollten. Haben Sie im Simulator "Inhalt und Einstellungen zurücksetzen" versucht? Funktioniert es auf einem echten Gerät? –

0

Fügen Sie einfach das gleiche Problem hinzu. Ich habe alle meine Entitäten kopiert. Das Datenmodell wurde gelöscht, ein leeres erstellt und die Entitäten wieder in das neue Datenmodell eingefügt. Mein Problem wurde gelöst.

1

Ich baute sauber, und das hat es nicht behoben. Dann löschte ich die App, und das hat es nicht behoben. Dann baute ich clean und löschte die App GLEICHZEITIG, und das reparierte es.

0

Zuerst habe ich die Daten der App über den Organizer heruntergeladen (um zu sehen, was passiert ist) und bemerkte, dass es mir angeboten hat, es unter einem früheren Projektnamen zu speichern. Das verwirrte mich. Also verließ ich XCode 4.6.1, löschte die App (und ihre Daten) von meinem iPhone und kam zurück.

Dieses Mal habe ich eine Fehlermeldung Cannot create an NSPersistentStoreCoordinator with a nil model. Also schaute ich in die AppDelegate.m Datei und änderte die URLForResource in der - (NSPersistentStoreCoordinator *) persistentStoreCoodinator Methode. Es wurde auf den Namen meiner App festgelegt, und ich änderte es in "Model", um den Namen meines Model.xcdatamodel zu entsprechen.
Es funktioniert jetzt.

21

Mein Problem ist, dass ich nicht den gleichen Namen für Entität und Klasse verwendet habe. Triviale Lösung, um es zu beheben, ist, indem Sie ihnen den gleichen Namen geben.

+0

ist es eine triviale Lösung? Sie können einfach die Standardkonfiguration (Zuordnung: Entität -> Klasse) im Datenmodell ändern. – gaussblurinc

7

Stellen Sie außerdem sicher, dass sich Ihre .xcdatamodeld-Datei in der Phase "Bundle-Ressourcen kopieren" Ihrer Build-Phasen befindet.

6

Überprüfen Sie, ob,

  • die Einheit in der xcdatamodel Datei.
  • Der verwendete Entitätsname ist derselbe.
0

Das ist mir passiert, als ich aus der falschen Datenbank abgerufen habe. Meine Anwendung hat 3 SQLite-Datenbanken und natürlich 3 ManagedObjectContext-Instanzen. Nun, ich habe den falschen ManagedObjectContext an eine Methode übergeben, die ihn auffordert, eine Tabelle abzufragen, die in dem übergebenen ManagedObjectContext nicht existierte. Nachdem der korrekte ManagedObjectContext verwendet wurde, war alles in Ordnung.

16

Wenn Sie mit MagicalRecored mit Swift:

Achten Sie darauf, @objc Direktive in der Swift NSManagedObject Unterklasse der Klasse zugänglich zu Objective-C-Code aus der MagicalRecord Bibliothek machen

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

Danke! Die Entitätsdatei wird jedoch überschrieben, wenn Sie die NSManagedObject-Unterklasse neu erstellen. Gibt es einen besseren Weg, diese Zeile jedes Mal manuell hinzuzufügen? – apb

+0

App Absturz in iOS 9.3 aber Arbeit mit iOS 10.3 wenn ich hinzufügen @objc (MyEntity) wie vorgeschlagen, es funktioniert auf iOS 9.3 aber App-Absturz auf iOS 10.3 keine Ahnung, warum es abstürzt? –

0

Ich denke, die ursprüngliche Frage/Problem, und auch das Problem, dass die meisten dieser Antworten (nur auf unterschiedliche Weise) behebt, ist nur ein ganz einfaches:

Jedes Mal, wenn Sie Ihre Kerndaten ändern (z. B. das Hinzufügen einer Entität), müssen Sie entweder alle vorhandenen Daten löschen (falls Sie Ihre App noch nicht veröffentlicht haben) oder eine neue Version zu Ihrem Modell hinzufügen.

Nur gedacht, ich würde diese Antwort posten, auch wenn das eine ältere Frage ist, weil diese Antwort ziemlich offensichtlich scheint und bisher in keiner der Fragen oder Kommentare besprochen wurde, die ich oben gelesen habe.

0

Sie auch Setter-Methode von CoraData verwenden können ... Genau das tun, so etwas wie dieses ...

Auf Ihrem CustomCoreDataManager.m

import "ObjectiveRecord.h" Aufruf init-Methode wie diese

(Instanztyp) init {

self = [Superinitial];

wenn (Selbst-) {

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

Rückkehr Selbst; }

Hoffnung dies jemand hilft ...

3

Hier ist, was es für mich festgelegt:

Als ich Swift 3 wurde die Umwandlung wurde Xcode mir ein Fehler geben, wenn eine neue NSFetchRequest erklären, sagen, dass Es brauchte einen Typ. Nachdem ich den Typ hinzugefügt hatte, tat ich, was jeder andere angenommen hätte; Wenn die Anfrage getippt wird, warum einen Namen angeben? Also habe ich es entfernt.

Es war tatsächlich mein Fehler.

Swift 2.2:

let request = NSFetchRequest(entityName: "MyEntity") 

Als ich nach Swift ersten 3 umgewandelt:

let request = NSFetchRequest<MyEntity>() 

Das ist mir einen Fehler gab. Ich endete damit:

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

Und alles funktioniert gut. Persönlich bin ich nicht sicher, warum ein Entitätsname angegeben werden muss, wenn Sie die Anfrage eingeben. Vielleicht werden sie irgendwann aktualisieren, dass (ich hoffe)

1

Wenn Sie Swift 3 verwenden und neue Stack-Syntax des 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 
}() 

Dann sollten Sie Syntax diese holen werden:

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

ich hatte diesen Fehler auf dem ersten Abruf nach App gestartet wird, wenn verschiedene Varianten mit:

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

let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Client") 
0

Vielleicht möchten Sie eine Datenbank aus einem anderen/falschen Bundle laden? Zum Beispiel von oder in einem Framework?

Ich hatte dieses Problem und löste es durch Laden der DB von der bundle des zugehörigen Framework. Und dann hat alles gut geklappt !!

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") 

Und voila!

Verwandte Themen