Coredata Error "data: <fault>"


107

Provo a estrarre i dati da CoreData con il seguente codice

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 dovrebbe avere 9 oggetti corrispondenti e trova i 9 oggetti. Quindi il predicato dovrebbe funzionare ma lo ottengo nella console

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

Funzionava perfettamente fino a quando non ho apportato la seguente modifica a Cave.m che è l'Entità

Ho aggiunto MKAnnotation come delegato in Cave.he ho aggiunto questo codice in Cave.m

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

C'è un modo per eseguire il debug di questo?

Risposte:


273

Questo è un comportamento previsto, i dati di base non restituiranno oggetti completi finché non sarà necessario accedere ai valori persistenti degli oggetti. Ciascuno dei tuoi oggetti restituiti sarà un "difetto" fino a questo punto.

Puoi forzare la richiesta di recupero per restituire oggetti completi usando [request setReturnsObjectsAsFaults:NO], ma nella maggior parte dei casi ciò che hai andrà bene. Guarda la documentazione per NSFetchRequest per maggiori informazioni.

Se accedi a una delle proprietà, i dati principali andranno all'archivio persistente e recupereranno il resto dei tuoi valori, quindi otterrai la descrizione completa nei log.

Questo sembra essere un malinteso così comune che ho deciso di scriverne qui .


57
puoi disattivare la proprietà chiamando [request setReturnsObjectsAsFaults: NO];
Qamar Suleiman

21
La colpa è
fonte di

1
Fault è una parola chiave generica utilizzata nell'architettura informatica
Abhishek Bedi il

@AbhishekBedi no non lo è. È una parola "speciale" utilizzata specificamente da Core Data per indicare qualcosa di diverso dalla normale definizione del dizionario. Una cattiva denominazione di sicuro.
Carson Holzheimer

4

Ho affrontato lo stesso problema durante il recupero dei dati da CoreData! Quindi, ho seguito il modo in cui @jrturton l'ha istruito e implementato in Swift 3 :

Passaggio 1: aggiungi import CoreData

Passaggio 2: aggiungi il codice di seguito. .

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! 
}

Spero ti possa aiutare. :)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.