NSPredicate, mdfind et format

hdexhdex Membre
18:21 modifié dans API AppKit #1
Comme ma dernière question a déchainer les foules  <3 (merci beaucoup au fait ... même si vous m'avez largué gentiment quand vous êtes parti sur l'encodage), je continue  :o<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 :
NSPredicate *addressBookPredicate = [NSPredicate predicateWithFormat:@&quot;(kMDItemKind == &#39;Address Book Person Data&#39;)&quot;];<br /><br />	int indexInString;<br />		for (indexInString = 0; indexInString &lt; [[voipDeviceSetting valueForKey:@&quot;lastcallernumber&quot;] 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:@&quot;lastcallernumber&quot;] substringWithRange:plusTwoRange]];<br />				<br />			} <br />	NSPredicate *phoneNumberPredicate = [NSPredicate predicateWithFormat:@&quot;kMDItemPhoneNumbers contains %@&quot;,arrayOfABPhonePredicates];<br />	NSLog(@&quot;Predicate creation Finished&quot;);<br />	[queryAddressBook setPredicate:<br />			[NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects:addressBookPredicate, phoneNumberPredicate, nil]]];<br />	NSLog(@&quot;Query prepared&quot;);<br />&nbsp; &nbsp; [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

Réponses

  • hdexhdex Membre
    18:21 modifié #2
    Je vais répondre à  ma propre question.

    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 :
    You cannot use an MDQuery operator as the VALUE of an NSPredicate object "KEY operator VALUE" string. For example, you write an "is-substring-of" expression in Spotlight like this: "myAttribute = '*foo*'"; in NSPredicate strings you use the contains operator, like this: "myAttribute contains 'foo'". Spotlight takes glob-like expressions, NSPredicate uses a different operator.

    If you use "*" as left-hand-side key in a comparison expression, in Spotlight it means "any key in the item" and can only be used with ==. You could only use this expression in an NSPredicate object in conjunction with an NSMetadataQuery object.


    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 ...) :
    <br />	NSMutableString *queryABString = [[NSMutableString alloc] initWithString:@&quot;(kMDItemContentType == &#39;com.apple.addressbook.person&#39;)&quot;];<br /><br />	if ([[voipDeviceSetting valueForKey:@&quot;lastcallernumber&quot;] length] != nil)<br />	 {<br />	int indexInString;<br />		for (indexInString = 0; indexInString &lt; [[voipDeviceSetting valueForKey:@&quot;lastcallernumber&quot;] length] ; indexInString+=2)<br />			{<br />			NSRange plusTwoRange = NSMakeRange(indexInString, 2);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Découpe le numéro par bloc de 2<br />			NSString *tempStringBuild = [[NSString alloc] initWithFormat:@&quot;(kMDItemPhoneNumbers LIKE[wc] &#39;*%@*&#39;)&quot;,[[voipDeviceSetting valueForKey:@&quot;lastcallernumber&quot;] substringWithRange:plusTwoRange]];<br />			[queryABString appendFormat:@&quot; AND %@&quot;,tempStringBuild];<br />			[tempStringBuild release];<br />			} <br /><br />	NSPredicate *queryPredicate = [NSPredicate predicateWithFormat:queryABString];<br /><br />	[queryAddressBook setPredicate:queryPredicate];<br />&nbsp; &nbsp; [queryAddressBook startQuery];<br />	[queryABString release];<br />
    

Connectez-vous ou Inscrivez-vous pour répondre.