2010-04-11 8 views
2

Je sais qu'il y a probablement une chose simple qui me manque, mais je me suis cogné la tête contre le mur depuis une heure ou deux. J'ai une base de données pour l'application Android sur laquelle je travaille actuellement (Android v1.6) et je veux juste insérer un seul enregistrement dans une table de base de données. Mon code se présente comme suit:Android insérer dans la base de données sqlite

//Save information to my table 
sql = "INSERT INTO table1 (field1, field2, field3) " + 
     "VALUES (" + field_one + ", " + field_two + ")"; 
Log.v("Test Saving", sql); 
myDataBase.rawQuery(sql, null); 

la variable myDatabase est un objet SQLiteDatabase qui permet de sélectionner les données de fin d'une autre table dans le schéma. L'enregistrement semble fonctionner correctement (aucune erreur dans LogCat) mais quand je copie la base de données de l'appareil et l'ouvre dans le navigateur sqlite le nouvel enregistrement n'est pas là. J'ai également essayé d'exécuter manuellement la requête dans le navigateur sqlite et cela fonctionne très bien. Le schéma de table pour table1 est _id, field1, field2, field3.

Toute aide serait grandement appréciée. Merci!

+5

Je recommande fortement d'utiliser des paramètres ("?") Plutôt que de concaténer vos chaînes dans la requête. Vous courez le risque de requêtes malformées ou d'attaques par injection. –

+0

@JimBlackler Pouvez-vous donner un petit exemple de l'utilisation de '?' Pour la requête ci-dessus. J'ai googlé mais je n'ai pas pu en trouver un. – VenomVendor

Répondre

0

J'ai changé mon code pour utiliser myDataBase.insert() au lieu de rawQuery() et cela fonctionne. Je ne sais pas pourquoi la requête sql réelle n'a pas fonctionné, donc si quelqu'un peut faire la lumière sur ce que je l'apprécierais encore.

+3

Si ce que vous avez posté est la requête exacte, c'est parce que vous spécifiez 3 champs mais seulement 2 valeurs. – tadamson

+26

'rawQuery()' est pour les requêtes. Une instruction 'INSERT' n'est pas une requête. Si vous voulez exécuter un SQL brut qui ne retourne pas un jeu de résultats, utilisez 'execSQL()'. – CommonsWare

+0

Ah, execSql() est ce dont j'avais besoin alors. Et oui, je passais 3 valeurs dans mon code mais il s'est perdu dans le nettoyage de code quand je l'ai collé ici. Merci! @CommonsWare, si vous postez cela comme une réponse ici, je vais vous donner le crédit pour le résoudre. – Blather

10

Votre requête n'est pas valide, car vous fournissez 2 valeurs pour 3 colonnes. Votre requête brute doit ressembler à:

sql = "INSERT INTO table1 (field1, field2) " + 
    "VALUES (" + field_one + ", " + field_two + ")"; 

bien que votre schéma contienne trois champs. En passant, vous pouvez voir le journal pour voir le rapport d'erreur réel de sqlite.

+0

J'ai nettoyé le code certains et accidentellement enlevé le troisième champ dans la section de valeurs. Bonne prise cependant. – Blather

5

Comme il est une des valeurs de chaîne que vous avez oublié « ' » ajouter ... cette requête va sûrement travailler, je l'ai testé

sql = "INSERT INTO table1 (field1, field2) " + 
"VALUES ('" + field_one + "', '" + field_two + "')"; 
+1

+1 pour de l'aide Maddy J – ekjyot

6

La bonne réponse est donnée par le CommonsWare dans les commentaires. Vous devriez utiliser execSql() au lieu de rawQuery(). Et ça fonctionne comme un charme. Je pensais que ce serait utile pour les autres, ne pas avoir à fouiller dans les commentaires pour trouver la bonne réponse.

Questions connexes