2010-04-05 5 views
2

J'essaye de mettre en place une base de données simple de SQLite dans Android, manipulant le schéma par l'intermédiaire d'une sous-classe de SQLiteOpenHelper. Cependant, lorsque j'interroge mes tables, les colonnes que je pense avoir insérées ne sont jamais présentes.Gotchas INSERTing dans SQLite sur Android?

A savoir, dans la méthode onCreate(SQLiteDatabase db) de SQLiteOpenHelper, j'utilise db.execSQL() pour exécuter les commandes CREATE TABLE, puis ont essayé les deux db.execSQL et db.insert() pour exécuter des commandes sur les INSERT tables que je viens de créer. Cela semble fonctionner correctement, mais quand j'essaie de les interroger, je reçois toujours 0 lignes retournées (pour le débogage, les requêtes que j'exécute sont simples SELECT * FROM table et en vérifiant getCount() du curseur).

Quelqu'un a déjà rencontré quelque chose comme ça? Ces commandes semblent s'exécuter sur la ligne de commande sqlite3. Sont-ils des pièges qui me manquent (par exemple INSERTS doit/ne doit pas être terminé par un point-virgule, ou un problème impliquant plusieurs tables)? J'ai joint une partie du code ci-dessous.

Merci pour votre temps, et laissez-moi savoir si je peux clarifier davantage.


@Override 
public void onCreate(SQLiteDatabase db) 
{ 
    db.execSQL("CREATE TABLE "+ LEVEL_TABLE +" (" + 
       " "+ _ID +" INTEGER PRIMARY KEY AUTOINCREMENT," + 
       " level TEXT NOT NULL,"+ 
       " rows INTEGER NOT NULL,"+ 
       " cols INTEGER NOT NULL);"); 

    db.execSQL("CREATE TABLE "+ DYNAMICS_TABLE +" (" + 
       " level_id INTEGER NOT NULL," + 
       " row INTEGER NOT NULL,"+ 
       " col INTEGER NOT NULL,"+ 
       " type INTEGER NOT NULL);"); 

    db.execSQL("CREATE TABLE "+ SCORE_TABLE +" (" + 
       " level_id INTEGER NOT NULL," + 
       " score INTEGER NOT NULL,"+ 
       " date_achieved DATE NOT NULL,"+ 
       " name TEXT NOT NULL);"); 
    this.enterFirstLevel(db); 
} 

et un échantillon du code d'insertion Je suis actuellement à l'aide, qui est appelé à enterFirstLevel() (codées en dur certaines valeurs juste pour le faire fonctionner ...):

private void insertDynamic(SQLiteDatabase db, int row, int col, int type) 
{ 
    ContentValues values = new ContentValues(); 

    values.put("level_id", "1"); 
    values.put("row", Integer.toString(row)); 
    values.put("col", Integer.toString(col)); 
    values.put("type", Integer.toString(type)); 

    db.insertOrThrow(DYNAMICS_TABLE, "col", values); 
} 

Enfin, le code de requête ressemble à ceci:

private Cursor fetchLevelDynamics(int id) 
{ 
    SQLiteDatabase db = this.leveldata.getReadableDatabase(); 
    try { 
     String fetchQuery = "SELECT * FROM " + DYNAMICS_TABLE; 
     String[] queryArgs = new String[0];   
     Cursor cursor = db.rawQuery(fetchQuery, queryArgs); 

     Activity activity = (Activity) this.context; 
     activity.startManagingCursor(cursor); 
     return cursor; 
    } 
    finally { 
     db.close(); 
    } 
} 

Répondre

0

Il semble assez bien pour moi.

Pour résoudre les problèmes, je suggère d'ajouter au moins une colonne à vos queryArgs. Je ne suis pas sûr de l'effet de l'envoi d'une liste vide. Il est possible que cela ne renvoie aucune ligne même s'il y a des résultats.

Il n'est pas nécessaire de convertir vos valeurs Integer en chaînes dans ContentValues. Essayez de remplacer values.put("row", Integer.toString(row)); avec juste values.put("row", row); Probablement pas la cause de votre problème, car il aurait levé une exception s'il s'opposait aux chaînes.

Je n'ai jamais utilisé SQLiteDatabase.rawQuery(), peut-être essayer le plus souvent .query()?

Je ne vois pas ce que votre code fait avec le 'curseur' retourné par fetchLevelDynamics() donc je ne peux pas exclure les erreurs de logique là-bas.

+0

Bien que ce wasn techniquement la réponse (je l'ai trouvé, et l'a écrit comme une réponse séparée à la question), j'ai apprécié les conseils de débogage, je voulais que la question marquée comme répondue, et de vous donner les points de réputation. Merci pour votre aide^_^ –

+0

Vous êtes les bienvenus. Heureux d'avoir pu aider. –

0

Essayez d'utiliser null pour le second paramètre dans

db.insertOrThrow(DYNAMICS_TABLE, "col", values); 
2

figured it out, il était quelques choses différentes. D'abord et avant tout, le code de la requête: un Cursor ne peut naviguer que dans une base de données ouverte. Ainsi, la méthode de requête ci-dessus renvoie un curseur, puis ferme la base de données dans le bloc finally.

Bien qu'il ne fonctionnera pas correctement, le curseur ne jettera pas une erreur s'il fonctionne sous une base de données fermée. Il va juste dire qu'il a retourné 0 lignes (c'est pourquoi je pensais que l'erreur était dans le code INSERT).

Aussi, j'ai oublié quelques choses SQL, à savoir que row et col ne sont pas de grands noms pour les champs de la table, et j'ai pu se débarrasser de quelques erreurs en les renommant à row_num et col_num