NSPredicate, mdfind et format
hdex
Membre
Comme ma dernière question a déchainer les foules (merci beaucoup au fait ... même si vous m'avez largué gentiment quand vous êtes parti sur l'encodage), je continue <br />
Bon alors, j'ai une appli qui récupère les infos d'un boitier VoIP et les présentent de manière simplifié à l'utilisateur. Jusqu'ici tout va bien.
Maintenant je voudrais faire une recherche sur le numéro de téléphone de l'appelant dans le Carnet d'Adresses pour que au lieu d'afficher 0800 046 04, je puisse afficher "Apple Store".
J'ai regarder du côté de ABSearchElement mais j'ai un problème de formatage des numéros (en gros si je fais une recherche sur 0800 046 04 et que le numéro dans le carnet d'adresse est 080004604 ben j'ai resultat = 0)
J'ai donc pensé à Soptlight et histoire de me faire la main, j'ai fait un test avec mdfind :
mdfind "kMDItemContentType==com.apple.addressbook.person && kMDItemPhoneNumbers='*08*' && kMDItemPhoneNumbers='*00*' && kMDItemPhoneNumbers='*04*' && kMDItemPhoneNumbers='*60*' && kMDItemPhoneNumbers='*04*' "
Bingo ça me renvoit une valeur, un petit mdls et je trouve bien un kMDItemDisplayName : "Apple Store"
Mon problème c'est de convertir ça en Cocoa, j'ai essayé de suivre l'exemple Apple mais je me retrouve toujours avec "NSComparisonPredicate with left expression which is not NSKeyPathExpressionType given to NSMetadataQuery ({"08", "00", "04", "60", "04"} IN kMDItemPhoneNumbers)
voici le code :
Le message d'erreur déboule au setPredicate.
J'ai essayé :
- stockage des Predicate dans des chaines de caractère
- un predicate par groupe de numéro
J'était tellement content de mon coup avec mdfind, je pensais pas mettre aussi longtemps a trouver l'équivalent Cocoa ... à moins que, comme d'hab, je loupe un truc évident.
Merci d'avance
Bon alors, j'ai une appli qui récupère les infos d'un boitier VoIP et les présentent de manière simplifié à l'utilisateur. Jusqu'ici tout va bien.
Maintenant je voudrais faire une recherche sur le numéro de téléphone de l'appelant dans le Carnet d'Adresses pour que au lieu d'afficher 0800 046 04, je puisse afficher "Apple Store".
J'ai regarder du côté de ABSearchElement mais j'ai un problème de formatage des numéros (en gros si je fais une recherche sur 0800 046 04 et que le numéro dans le carnet d'adresse est 080004604 ben j'ai resultat = 0)
J'ai donc pensé à Soptlight et histoire de me faire la main, j'ai fait un test avec mdfind :
mdfind "kMDItemContentType==com.apple.addressbook.person && kMDItemPhoneNumbers='*08*' && kMDItemPhoneNumbers='*00*' && kMDItemPhoneNumbers='*04*' && kMDItemPhoneNumbers='*60*' && kMDItemPhoneNumbers='*04*' "
Bingo ça me renvoit une valeur, un petit mdls et je trouve bien un kMDItemDisplayName : "Apple Store"
Mon problème c'est de convertir ça en Cocoa, j'ai essayé de suivre l'exemple Apple mais je me retrouve toujours avec "NSComparisonPredicate with left expression which is not NSKeyPathExpressionType given to NSMetadataQuery ({"08", "00", "04", "60", "04"} IN kMDItemPhoneNumbers)
voici le code :
NSPredicate *addressBookPredicate = [NSPredicate predicateWithFormat:@"(kMDItemKind == 'Address Book Person Data')"];<br /><br /> int indexInString;<br /> for (indexInString = 0; indexInString < [[voipDeviceSetting valueForKey:@"lastcallernumber"] length] ; indexInString+=2)<br /> {<br /> NSRange plusTwoRange = NSMakeRange(indexInString, 2); // decoupe le numéro de téléphone par groupe de 2 digit<br /> <br /> [arrayOfABPhonePredicates addObject:[[voipDeviceSetting valueForKey:@"lastcallernumber"] substringWithRange:plusTwoRange]];<br /> <br /> } <br /> NSPredicate *phoneNumberPredicate = [NSPredicate predicateWithFormat:@"kMDItemPhoneNumbers contains %@",arrayOfABPhonePredicates];<br /> NSLog(@"Predicate creation Finished");<br /> [queryAddressBook setPredicate:<br /> [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:addressBookPredicate, phoneNumberPredicate, nil]]];<br /> NSLog(@"Query prepared");<br /> [queryAddressBook startQuery];<br />
Le message d'erreur déboule au setPredicate.
J'ai essayé :
- stockage des Predicate dans des chaines de caractère
- un predicate par groupe de numéro
J'était tellement content de mon coup avec mdfind, je pensais pas mettre aussi longtemps a trouver l'équivalent Cocoa ... à moins que, comme d'hab, je loupe un truc évident.
Merci d'avance
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Query Expression Syntax explique le genre de syntaxe pour Spotlight et Predicate Programming Guide précise que la syntaxe pour le NSPredicate est différente, en particulier :
Je continuait donc à chercher à convertir ma syntaxe mdfind en syntaxe NSPredicate jusqu'a ce que je tombe sur des posts indiquant le contraire (ici et la).
Voici donc le code qui marche pour une recherche de numéro de téléphone (au format XXXXXXXXXX) par Spotlight dans le carnet d'adresse quelque soit le formatage du numéro (XX XX XX XX XX, XX XXXX XXXX etc ...) :