Erreur Coredata "data: <fault>"

107

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 j'obtiens cela 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?

Chris
la source

Réponses:

273

Il s'agit d'un comportement attendu, les données de base ne renverront pas d'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 en utilisant [request setReturnsObjectsAsFaults:NO], mais dans la plupart des cas, ce que vous avez fera l'affaire. 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 dans le magasin persistant et récupèrent le reste de vos valeurs, puis vous obtiendrez la description complète dans les journaux.

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

jrturton
la source
57
vous pouvez désactiver la propriété en appelant [request setReturnsObjectsAsFaults: NO];
Qamar Suleiman
21
La faute est déroutante, ils auraient pu dire `` données non récupérées '' ou quelque chose du
genre
1
Fault est un mot-clé générique utilisé dans l'architecture informatique
Abhishek Bedi
@AbhishekBedi non, ce n'est pas le cas. C'est un mot «spécial» utilisé spécifiquement par Core Data pour signifier quelque chose de différent de la définition normale du dictionnaire. Mauvaise dénomination, c'est sûr.
Carson Holzheimer
4

J'ai rencontré le même problème en extrayant des données de CoreData! Donc, j'ai suivi la façon dont @jrturton l'a instruit et mis en œuvre dans Swift 3 :

Étape 1: ajouter 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. :)

roy
la source