J'ai une application Android qui doit vérifier s'il y a déjà un enregistrement dans la base de données, et sinon, traiter certaines choses et finalement l'insérer, et simplement lire les données de la base de données si les données existent. J'utilise une sous-classe de SQLiteOpenHelper pour créer et obtenir une instance réinscriptible de SQLiteDatabase, qui, je pensais, s'occupait automatiquement de créer la table si elle n'existait pas déjà (puisque le code pour le faire est dans le onCreate (... ) méthode).
Cependant, lorsque la table n'existe PAS encore et que la première méthode exécutée sur l'objet SQLiteDatabase que j'ai est un appel à la requête (...), mon logcat affiche une erreur de "I / Database (26434): sqlite a retourné: erreur code = 1, msg = aucune table de ce type: appdata ", et bien sûr, la table appdata n'est pas en cours de création.
Des idées sur pourquoi?
Je recherche soit une méthode pour tester si la table existe (car si ce n'est pas le cas, les données ne sont certainement pas dedans, et je n'ai pas besoin de la lire avant d'y écrire, ce qui semble créer la table correctement), ou un moyen de s'assurer qu'il est créé, et est juste vide, à temps pour ce premier appel à la requête (...)
EDIT
Cela a été posté après les deux réponses ci-dessous:
Je pense que j'ai peut-être trouvé le problème. Pour une raison quelconque, j'ai décidé qu'un SQLiteOpenHelper différent était censé être créé pour chaque table, même si les deux accèdent au même fichier de base de données. Je pense que refactoriser ce code pour n'utiliser qu'un seul OpenHelper, et créer les deux tables à l'intérieur de onCreate peut fonctionner mieux ...
cursor.close();
select * from sqlite_master where UPPER(name) = 'ROUTES'.
Je ne sais rien de l'API Android SQLite, mais si vous pouvez lui parler directement en SQL, vous pouvez le faire:
create table if not exists mytable (col1 type, col2 type);
Ce qui garantira que la table est toujours créée et ne lèvera aucune erreur si elle existait déjà.
la source
Bien qu'il y ait déjà beaucoup de bonnes réponses à cette question, j'ai trouvé une autre solution que je trouve plus simple. Entourez votre requête d'un bloc try et de la capture suivante:
catch (SQLiteException e){ if (e.getMessage().contains("no such table")){ Log.e(TAG, "Creating table " + TABLE_NAME + "because it doesn't exist!" ); // create table // re-run query, etc. } }
Cela a fonctionné pour moi!
la source
e.getMessage().contains("no such table")
c'est pire que d'utiliser des exceptions pour contrôler le flux. Les deux sont de mauvais style, mais l'analyse des messages d'erreur pour un texte spécifique est même un très mauvais style.C'est ce que j'ai fait:
/* open database, if doesn't exist, create it */ SQLiteDatabase mDatabase = openOrCreateDatabase("exampleDb.db", SQLiteDatabase.CREATE_IF_NECESSARY,null); Cursor c = null; boolean tableExists = false; /* get cursor on it */ try { c = mDatabase.query("tbl_example", null, null, null, null, null, null); tableExists = true; } catch (Exception e) { /* fail */ Log.d(TAG, tblNameIn+" doesn't exist :((("); } return tableExists;
la source
Oui, il s'avère que la théorie de ma modification était juste: le problème qui empêchait l'exécution de la méthode onCreate était le fait que les
SQLiteOpenHelper
objets devaient faire référence à des bases de données et ne pas en avoir une séparée pour chaque table. Le regroupement des deux tables en une seule aSQLiteOpenHelper
résolu le problème.la source
Vous avez mentionné que vous avez créé une classe qui étend
SQLiteOpenHelper
et implémente laonCreate
méthode. Assurez-vous que vous effectuez tous vos appels d'acquisition de base de données avec cette classe? Vous ne devriez obtenir desSQLiteDatabase
objets que via leSQLiteOpenHelper#getWritableDatabase
,getReadableDatabase
sinon laonCreate
méthode ne sera pas appelée si nécessaire. Si vous faites déjà cela, vérifiez et voyez si laSQLiteOpenHelper#onUpgrade
méthode est appelée à la place. Si tel est le cas, le numéro de version de la base de données a été modifié à un moment donné, mais la table n'a jamais été créée correctement lorsque cela s'est produit.En passant, vous pouvez forcer la recréation de la base de données en vous assurant que toutes les connexions sont fermées et en appelant
Context#deleteDatabase
, puis en utilisant leSQLiteOpenHelper
pour vous donner un nouvel objet db.la source
// @param db, readable database from SQLiteOpenHelper public boolean doesTableExist(SQLiteDatabase db, String tableName) { Cursor cursor = db.rawQuery("select DISTINCT tbl_name from sqlite_master where tbl_name = '" + tableName + "'", null); if (cursor != null) { if (cursor.getCount() > 0) { cursor.close(); return true; } cursor.close(); } return false; }
la source
public boolean isTableExists(String tableName) { boolean isExist = false; Cursor cursor = db.rawQuery("select DISTINCT tbl_name from sqlite_master where tbl_name = '" + tableName + "'", null); if (cursor != null) { if (cursor.getCount() > 0) { isExist = true; } cursor.close(); } return isExist; }
la source
no such table exists: error
arrive car une fois que vous créez une base de données avec une table après cela, chaque fois que vous créez une table dans la même base de données, cette erreur s'affiche.Pour résoudre cette erreur, vous devez créer une nouvelle base de données et dans la méthode onCreate (), vous pouvez créer plusieurs tables dans la même base de données.
la source
La condition importante est IF NOT EXISTS pour vérifier que la table existe déjà ou pas dans la base de données
comme...
String query = "CREATE TABLE IF NOT EXISTS " + TABLE_PLAYER_PHOTO + "(" + KEY_PLAYER_ID + " TEXT," + KEY_PLAYER_IMAGE + " TEXT)"; db.execSQL(query);
la source
J'ai fait face à cela et le gérer en essayant de capturer aussi simple que cela je fais ce que je veux dans la table s'il n'existe pas, cela causera une erreur, alors attrapez-le par exceptions et créez-le :)
SQLiteDatabase db=this.getWritableDatabase(); try{ db.execSQL("INSERT INTO o_vacations SELECT * FROM vacations"); db.execSQL("DELETE FROM vacations"); }catch (SQLiteException e){ db.execSQL("create table o_vacations (id integer primary key ,name text ,vacation text,date text,MONTH text)"); db.execSQL("INSERT INTO o_vacations SELECT * FROM vacations"); db.execSQL("DELETE FROM vacations"); }
la source
..... Toast t = Toast.makeText (contexte, "essayez ...", Toast.LENGTH_SHORT); t.show ();
Cursor callInitCheck = db.rawQuery("select count(*) from call", null); Toast t2a = Toast.makeText(context, "count rows " + callInitCheck.getCount() , Toast.LENGTH_SHORT); t2a.show(); callInitCheck.moveToNext(); if( Integer.parseInt( callInitCheck.getString(0)) == 0) // if no rows then do { // if empty then insert into call
.....
la source