Vous avez probablement voulu dire ceci:
String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = ?";
String[] selectionArgs = new String[]{String.valueOf(1)};
ou cette
String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = ?";
String[] selectionArgs = new String[]{"1"};
ou cette
String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = '1'";
String[] selectionArgs = null;
ou tout simplement ce
String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = 1";
String[] selectionArgs = null;
Les quatre sélections ont les mêmes résultats: Les contacts qui ont un numéro de téléphone.
SQLite (le type de base de données qui est utilisé sur Android) ne supporte pas les booléens (voir Datatypes in SQLite Version 3), true
et false
sont généralement stockés sous forme d'entiers 1
et 0
. Donc, pour vérifier si un champ booléen est vrai, vous vérifiez s'il a la valeur 1
.
Les extraits de code # 1 et # 2 utilisent un prepared statement qui contient un paramètre ou un espace réservé remplacé par la première valeur du tableau selectionArgs
(puisqu'il s'agit du premier paramètre de la requête). C'est une technique de protection contre l'injection SQL qui rend souvent vos requêtes plus lisibles. selectionArgs
doit être un tableau de String
valeurs, de sorte que la valeur entière 1
dans le snippet # 1 doit être convertie en String
d'abord (en utilisant String.valueOf(int)
n'a de sens que si vous transmettez une variable plutôt qu'un nombre constant). Si vous n'utilisez aucune variable dans votre instruction select, vous pouvez simplement insérer toutes les valeurs dans l'instruction n'utilisant pas d'espace réservé et selectionArgs
comme dans les extraits de code # 3 et # 4. Comme SQLite est typé dynamiquement, peu importe si vous vérifiez l'égalité à 1
ou '1'
, l'interpréteur SQL l'obtiendra dans les deux cas.
Cela ne ressemble pas à du code Java valide. Ajoutez également plus de contexte à nos extraits de code. 'selection' et' selectionArgs' ne semblent pas appartenir ensemble. – Marten