web-dev-qa-db-fra.com

Erreur de données "données: <fault>"

J'essaye d'extraire des données de CoreData avec le code suivant

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 doit avoir 9 objets correspondants et il trouve les 9 objets. Donc, le prédicat devrait fonctionner mais je l'obtiens dans la 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>)"
)

Cela fonctionnait parfaitement bien jusqu'à ce que je fasse le changement suivant dans Cave.m qui est l'entité

J'ai ajouté MKAnnotation en tant que délégué dans Cave.h et ajouté ce code dans Cave.m

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

Existe-t-il un moyen de déboguer cela?

102
Chris

Il s'agit d'un comportement attendu, les données de base ne renverront pas les objets complets tant que vous n'aurez pas besoin d'accéder aux valeurs persistantes des objets. Chacun de vos objets retournés sera une "faute" jusqu'à ce point.

Vous pouvez forcer la demande de récupération à renvoyer des objets complets à l'aide de [request setReturnsObjectsAsFaults:NO], mais dans la plupart des cas, ce que vous avez sera bien. Consultez la documentation de NSFetchRequest pour plus d'informations.

Si vous accédez à l'une des propriétés, les données de base iront au magasin persistant et récupéreront le reste de vos valeurs, puis vous obtiendrez la description complète dans les journaux.

Cela semble être un malentendu si commun que j'ai décidé d'écrire à ce sujet, ici .

266
jrturton

J'ai rencontré le même problème lors de l'extraction de données de CoreData! Donc, j'ai suivi la façon dont @jrturton l'a instruit et l'ai implémenté dans Swift:

Étape 1: ajoutez import CoreData

Étape 2: ajoutez le code ci-dessous. .

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

J'espère que cela vous aidera. :)

2
roy