2010-08-23 3 views
2

J'essaie de faire une opération de requête bitwise relativement simple avec SQLite sur Android. Lorsque j'utilise des variables de liaison, aucune donnée n'est renvoyée lorsque je pense que certaines lignes doivent être récupérées. Si je code directement la valeur de la variable bind dans le SQL, cela fonctionne très bien. Je pense que j'ai un problème de syntaxe stupide quelque part, mais je ne peux pas le voir.Android SQLite et les variables de liaison Problème

Donc, ce code fonctionne très bien:

String selection = new String(FLAGS + " & 2 = 2"); 
cursor = db.query(TABLE_NAME, ALL_COLUMNS, selection, 
    null, null, null, null, null); 

Ce code cependant (en utilisant les variables de liaison), retourne aucune ligne:

String selection = new String(FLAGS + " & ? = ?"); 
String[] selectionArgs = new String[]{"2", "2"}; 
cursor = db.query(TABLE_NAME, ALL_COLUMNS, selection, 
    selectionArgs, null, null, null, null); 

Ils ont tous deux résultat dans une requête syntaxiquement identique en construction quand je inspecter la propriété mQuery du curseur via le débogueur. Ce dernier a également la propriété mBindArgs correctement renseignée. Je ne sais pas comment cela pourrait échouer. Il n'y a pas d'exceptions lancées ou quoi que ce soit, cela ne renvoie aucune ligne.

Je peux prendre la requête qui échoue, et permuter manuellement les points d'interrogation pour les deux et le coller dans l'interface de ligne de commande ADB SQLite et cela fonctionne très bien aussi.

Répondre

1

Si je suis juste la deuxième requête produit à la condition suivante:

& '2' = '2' 

au lieu de

& 2 = 2 

Essayez de remplacer & avec AND

Assurez-vous que vous avez pas ? caractères FLAG constante . Outre ce qui est un point de cette condition logique?

+0

Il est une opération au niveau du bit, je dois utiliser le &. Je suis en train de tester quels bits d'une valeur de drapeau sont définis. J'ai aussi pensé aux citations, mais pour autant que je sache, cela ne serait pas cohérent. La propriété mQuery du curseur, qui affiche le code SQL construit, n'affiche pas non plus de guillemets autour des points d'interrogation. – Mike

1

Je faisais face au même problème que le vôtre. Comme le dit radek-k, la requête compare la chaîne.

Une solution qui peut être réalisée est d'utiliser les éléments suivants:

String selection = new String(FLAGS + " & ? = (0|?)"); 
+0

Cela a fait l'affaire dans mon cas. Je vous remercie! – Wayne