ValueForKey et booléen
Rocou
Membre
J'essaie de tester la valeur d'un booléen issu d'une base de données mais je n'y arrive pas.
Voici mon code: ('verifie' est un champ de type booléen)
Le programme entre dans le 'if' et affiche 'false' ???
Voici mon code: ('verifie' est un champ de type booléen)
if ([[rs dictionaryFromRecord] valueForKey:@"verifie"])<br /> NSLog(@"verifie: %@",[[rs dictionaryFromRecord] valueForKey:@"verifie"]);
Le programme entre dans le 'if' et affiche 'false' ???
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
C'est normal, tout comme le if du c, toute valeur différentes de 0 est synonymes de vrai, ici ton un objet NSNumber est renvoyé, c'est différent de 0, donc vrai.
Il faudrait écrire :
Merci. J'ai bien compris le principe mais cela ne fonctionne pas (j'obtiens toujours 0). J'imagine que le type booléen est "crypté" d'une façon particulière par PostgreSQL. Je vais creuser de ce côté.
Essai d'afficher le type de classe que renvoie valueForKey:@verifie par le code ci-dessous juste avant ton if :
avec les quelques renseignements renvoyés par NSLog, ça va permettre de mieux cerner ce mystérieux bool.
Merci pour ta patience, alors voici ce que cela donne:
instance=387b0, classe=NSCFString, description=false
C'est normal regardes :
Le premier NSLog() affiche 1 et le deuxième 0. Comme je le disais plus haut, en C et donc en objective-c, dans les if 0=false=NO et 1=true=YES.
Comme ton bool est renvoyé sous forme de chaine valant soit false, soit true.
Remplace ton if par :
Oui, ça j'ai bien compris mais je ne vois pas le rapport avec le NSLog proposé par No qui est censé afficher 0 si le contenu de mon champ est false et 1 s'il est égale à true.
J'ai contourné le problème en faisant mon test directement dans ma requête SQL mais c'est une solution provisoire me permettant néanmoins d'avancer. Mais j'aimerais bien comprendre comment interpréter mon champ booléen directement en objective-c.
Hélas, cela ne change rien, on ne passe jamais dans ce 'if' :-\\
Normal, le NSLog que tu as renvoyé retourne la chaine "false", donc le test du if est négatif (puisque je test avec "true").
Si tu remplaces true par false dans le equalToString:, tu passeras dans ton if.
???
Mais quel est l'intérêt? Que je passe tout le temps dans le if ou pas du tout, ça ne change rien. Il faut que j'y passe ou pas selon la valeur du champ 'verifie' qui est, soit FALSE soit TRUE.
Ou alors on ne parle pas de la même chose.
EDIT: Par ailleurs, après test, on ne passe toujours pas dans mon if que je mettre true ou false dans le equalToString:
Par contre étonnant que [... isEqualToString:@true] ne fonctionne pas pour le coup. Faudrait décomposer ton résultat de valueForKey pour le disséquer. Déjà on l'a un peu fait avec le NSLog de No, ça semble être une NSCFString (autrement dit une NSString) pourtant... faut vérifier les 2 valeurs possibles (à priori @true et @false pourtant mais bon) et creuser d'avantage...
Le résultat du NSLog que je t'ai demandé montre ceci :
instance=387b0Â ->Â le pointeur de l'objet semble correct (pas nil),
classe=NSCFString -> la classe de l'objet est NSString,
description=false -> le contenu de l'objet est la chaine "false".
Peut être (mais je suppute), que la classe de connexion à ta base pgsql n'effectue pas une conversion correcte entre le pilote pgsql (qui doit être du C, et donc renvoie les chaines terminées par le caractère 0) et l'objet NSString.
Fais ce dernier test :
Je pense aussi que le problème vient de la classe de connexion.
Voici ce que ton code donne (systématiquement):
chaine=<false>, data=<66616c73 65>
Maintenant, je le pense aussi.
Même si il y a VRAI dans le résultat de données de la base, cela te renvoie la chaine false dans ton programme.
Je vais essayer de contacter l'auteur de la classe. En tout cas merci à tous pour le temps passé, j'ai une fois de plus appris beaucoup de choses.