2010-07-29 5 views
1

En essayant d'obtenir un objet de ma base de données SQLite dans mon application Android. Je sais que le contact est dans la base de données parce que quand je l'ajoute et essaie de trouver par ID, il renvoie l'objet. Lorsque j'essaie de trouver par nom et prénom, cependant, il jette une exception et je suis parti avec une référence nulle. Voici la requête:Exception de levée de requête SQLite dans Android

cursor = mDb.query(DB_CONTACTS_NAME, 
    new String[] {KEY_ID, KEY_LAST_NAME, KEY_FIRST_NAME, KEY_EMAIL_ADDRESS, 
       KEY_ORGANIZATION_NAME, KEY_LABEL, KEY_LABEL_POSITION}, 
    KEY_FIRST_NAME + "=" + first + " AND " + KEY_LAST_NAME + "=" + last, 
    null, null, null, null 
); 

J'ai également essayé de trouver juste par prénom et juste par nom de famille. Même résultat que ci-dessus.

Edit: L'exception est une exception SQLite

no such column: aurelius: , while compiling: SELECT _id, last_name, first_name, 
email_address, organization_name, label, label_position FROM contacts WHERE 
first_name=marcus AND last_name=aurelius 

Et se produit également lorsque vous essayez de sélectionner tout premier ou le dernier nom

no such column: marcus: , while compiling: SELECT _id, last_name, first_name, 
email_address, organization_name, label, label_position FROM contacts WHERE 
first_name=marcus 
+0

Quel est le type et le message d'exception? – Akusete

+0

Tout à fait, juste édité la question pour clarifier à ce sujet. Merci pour toute aide à l'avance. –

Répondre

3

Vous devez citer les chaînes de caractères. Cela devrait fonctionner:

cursor = mDb.query(DB_CONTACTS_NAME, 
    new String[] {KEY_ID, KEY_LAST_NAME, KEY_FIRST_NAME, KEY_EMAIL_ADDRESS, 
       KEY_ORGANIZATION_NAME, KEY_LABEL, KEY_LABEL_POSITION}, 
    KEY_FIRST_NAME + "='" + first + "' AND " + KEY_LAST_NAME + "='" + last + "'", 
    null, null, null, null 
); 

Sinon, lorsque le

de voir l'interpréteur SQL
first_name=marcus 

Vous ne pouvez pas attendre de savoir que « marcus » est pas un nom de table ou d'une variable. Sur une note de côté, essayez de rechercher le nom de famille "Billy" ");

DO NOT CONSTRUCT SQL QUERIES FROM DATA STRINGS

Au lieu d'utiliser une requête qui prend dans une liste d'arguments. Rechercher les documents pour quelque chose comme

String[] myArguments = new String[] {first, last}; 
cursor = mDb.query("SELECT * FROM contacts WHERE first_name = ? AND last_name = ?;", myArguments); 

Ceci est beaucoup plus sûr. Dans votre version, si les variables 'first' ou 'last' contiennent des caractères de contrôle que SQLite interprète comme des commandes, vous risquez de casser votre système de base de données. NE PAS FAIRE ... JAMAIS

+1

Monsieur, vous avez raison. Je n'ai jamais pensé que je serais celui qui commettrait cette erreur après avoir lu cette bande dessinée il y a quelques temps, mais hélas, je l'ai fait. –

0

Oui, ceci est la réponse! Je voudrais avoir les points pour voter ça! Plus précisément, les chaînes de la clause WHERE doivent avoir les guillemets simples autour d'eux:

KEY_FIRST_NAME + "= '" + premier + "' ET" + KEY_LAST_NAME + "= '" + dernier + "'"

Questions connexes