objective c - NSPredicate de données de base "supprimé== NON" ne fonctionne pas comme prévu




objective-c core-data (2)

J'utilise UIManagedDocument avec le contexte parent enfant.

Dans mon contexte d'enfant, je fais ce qui suit

Code 1

NSSet *results = [self.event.memberships filteredSetUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {

    return ([[evaluatedObject deleted] boolValue] == NO);

}]];

Au-dessus du code renvoie les résultats attendus (uniquement les membres non supprimés pour l'événement).

Code 2

Mais ce code ne le fait pas. Il récupère tous les enregistrements.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"deleted == NO"];
NSSet *results = [self.event.memberships filteredSetUsingPredicate:predicate];

Cela semble confus. Les deux devraient retourner les mêmes résultats, mais predicateWithBlock renvoie des résultats corrects où predicateWithFormat renvoie tous les enregistrements.

Quels sont les avantages et les inconvénients de l'utilisation de predicateWithBlock au lieu de predicateWithFormat ?


Le problème est que vous avez défini un attribut deleted pour votre entité. Cela est en conflit avec la méthode isDeleted de NSManagedObject , vous devez donc renommer cet attribut.

L'expérience suivante montre que des choses étranges se produisent si vous appelez votre attribut "deleted" ( c est un objet géré avec un attribut deleted personnalisé):

// Set custom "deleted" property to YES:
c.deleted = @YES;

// Use the property, as your Code 1
NSLog(@"%@", [c deleted]);
// Output: 1

// Use Key-Value Coding, as your Code 2
NSLog(@"%@", [c valueForKey:@"deleted"]);
// Output: 0

// Now really delete the object and try again:
[context deleteObject:c];
NSLog(@"%@", [c valueForKey:@"deleted"]);
// Output: 1

Votre "Code 1" se réfère à la propriété, donc il renvoie le résultat attendu. "Code 2" utilise le codage Key-Value, et [c valueForKey:@"deleted"] renvoie YES si l'objet a été supprimé du contexte!

Donc renommer cet attribut devrait résoudre votre problème. Malheureusement, le compilateur n'émet pas d'avertissement si un nom d'attribut est en conflit avec une méthode intégrée.


Utilisez l'espace réservé de mise en forme pour remplacer la valeur bool:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", @"deleted", @(NO)];

Votre utilisation du chemin de clé est probablement ok, mais le côté droit ne ressemble probablement pas à "NON" à l'analyseur.





uimanageddocument