Error de Coredata "datos: <predeterminado>"

107

Intento extraer datos de CoreData con el siguiente código

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 debe tener 9 objetos coincidentes y encuentra los 9 objetos. Entonces el predicado debería funcionar pero obtengo esto en la consola

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

Solía ​​funcionar perfectamente bien hasta que hice el siguiente cambio en Cave.m, que es la Entidad

Agregué MKAnnotation como delegado en Cave.hy agregué este código en Cave.m

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

¿Hay alguna forma de depurar esto?

Chris
fuente

Respuestas:

273

Este es el comportamiento esperado, los datos centrales no devolverán objetos completos hasta que necesite acceder a los valores persistentes de los objetos. Cada uno de sus objetos devueltos será una 'falla' hasta este punto.

Puede forzar la solicitud de recuperación para devolver objetos completos usando [request setReturnsObjectsAsFaults:NO], pero en la mayoría de los casos lo que tiene estará bien. Consulte la documentación de NSFetchRequest para obtener más información.

Si accede a una de las propiedades, los datos centrales irán al almacén persistente y obtendrán el resto de sus valores, luego obtendrá la descripción completa en los registros.

Este parece ser un malentendido tan común que decidí escribir sobre él aquí .

jrturton
fuente
57
puede desactivar la propiedad llamando a [request setReturnsObjectsAsFaults: NO];
Qamar Suleiman
21
La falla es confusa, podrían haber dicho 'datos no recuperados' o algo así
Cristi Băluță
1
Fallo es una palabra clave genérica utilizada en la arquitectura de las ciencias de la computación
Abhishek Bedi
@AbhishekBedi no, no lo es. Es una palabra "especial" utilizada específicamente por Core Data para significar algo diferente a la definición normal del diccionario. Mal nombre seguro.
Carson Holzheimer
4

¡Enfrenté el mismo problema al extraer datos de CoreData! Entonces, seguí la forma en que @jrturton lo instruyó y lo implementé en Swift 3 :

Paso 1: agregar import CoreData

Paso 2: agregue el código a continuación. .

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

Espero que te ayude . :)

Roy
fuente