Coredata-Fehler "Daten: <Fehler>"

107

Ich versuche, Daten mit dem folgenden Code aus CoreData abzurufen

NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"Cave" inManagedObjectContext:self.context];
request.predicate = [NSPredicate predicateWithFormat:@"(latitude > 0) AND (longitude > 0)"];

NSError *error;
NSLog(@"%@",[self.context executeFetchRequest:request error:&error]);
NSLog(@"%@",[error localizedDescription]);

CoreData sollte 9 übereinstimmende Objekte haben und findet die 9 Objekte. Das Prädikat sollte also funktionieren, aber ich bekomme es in der Konsole

2011-09-05 07:41:42.267 CaveConditions[6930:11903] (
    "<NSManagedObject: 0x7368060> (entity: Cave; id: 0x7367880 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p31> ; data: <fault>)",
    "<NSManagedObject: 0x73547e0> (entity: Cave; id: 0x7356e20 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p40> ; data: <fault>)",
    "<NSManagedObject: 0x73681e0> (entity: Cave; id: 0x7363e60 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p42> ; data: <fault>)",
    "<NSManagedObject: 0x7368280> (entity: Cave; id: 0x7356be0 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p72> ; data: <fault>)",
    "<NSManagedObject: 0x7368320> (entity: Cave; id: 0x733ad80 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p73> ; data: <fault>)",
    "<NSManagedObject: 0x73683c0> (entity: Cave; id: 0x7333e70 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p91> ; data: <fault>)",
    "<NSManagedObject: 0x7368480> (entity: Cave; id: 0x7361810 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p101> ; data: <fault>)",
    "<NSManagedObject: 0x7368570> (entity: Cave; id: 0x7360110 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p105> ; data: <fault>)",
    "<NSManagedObject: 0x7368610> (entity: Cave; id: 0x73303c0 <x-coredata://C825FC9D-3490-4D8A-A811-979B819A2EB6/Cave/p112> ; data: <fault>)"
)

Früher hat es perfekt funktioniert, bis ich die folgende Änderung in Cave.m vorgenommen habe, bei der es sich um die Entität handelt

Ich habe MKAnnotation als Delegat in Cave.h hinzugefügt und diesen Code in Cave.m hinzugefügt

- (CLLocationCoordinate2D)coordinate
{
    CLLocationCoordinate2D location;
    location.latitude = [self.latitude doubleValue];
    location.longitude = [self.longitude doubleValue];
    return location;
}

Gibt es eine Möglichkeit, dies zu debuggen?

Chris
quelle

Antworten:

273

Dies ist das erwartete Verhalten. Kerndaten geben erst dann vollständige Objekte zurück, wenn Sie auf die persistenten Werte der Objekte zugreifen müssen. Jedes Ihrer zurückgegebenen Objekte ist bis zu diesem Zeitpunkt ein "Fehler".

Sie können die Abrufanforderung zwingen, vollständige Objekte mit zurückzugeben [request setReturnsObjectsAsFaults:NO], aber in den meisten Fällen ist das, was Sie haben, in Ordnung. Weitere Informationen finden Sie in der Dokumentation zu NSFetchRequest.

Wenn Sie auf eine der Eigenschaften zugreifen, werden die Kerndaten in den persistenten Speicher verschoben und der Rest Ihrer Werte abgerufen. Die vollständige Beschreibung erhalten Sie in den Protokollen.

Dies scheint ein so häufiges Missverständnis zu sein, dass ich mich entschlossen habe, hier darüber zu schreiben .

jrturton
quelle
57
Sie können die Eigenschaft deaktivieren, indem Sie [request setReturnsObjectsAsFaults: NO] aufrufen.
Qamar Suleiman
21
Fehler ist verwirrend, sie hätten sagen können, dass Daten nicht abgerufen wurden oder so
Cristi Băluță
1
Fehler ist ein allgemeines Schlüsselwort, das in der Informatikarchitektur verwendet wird
Abhishek Bedi
@AbhishekBedi nein ist es nicht. Es ist ein "spezielles" Wort, das speziell von Core Data verwendet wird, um etwas anderes als die normale Wörterbuchdefinition zu bedeuten. Sicher schlechte Benennung.
Carson Holzheimer
4

Ich hatte das gleiche Problem beim Abrufen von Daten aus CoreData! Also folgte ich der Anweisung von @jrturton und implementierte sie in Swift 3 :

Schritt 1: Hinzufügen import CoreData

Schritt 2: Fügen Sie den folgenden Code hinzu. .

let context = ( UIApplication.shared.delegate as! AppDelegate ).persistentContainer.viewContext
var request = NSFetchRequest<NSFetchRequestResult>()
request = Your_Entity_Name.fetchRequest()
request.returnsObjectsAsFaults = false
do {
    let arrayOfData = try context.fetch(request)
} catch {
    // Handle the error! 
}

Hoffe, es wird dir helfen. :) :)

Roy
quelle