web-dev-qa-db-fra.com

Comment vérifier si une table existe dans une base de données Android SQLite?)?

J'ai une application Android) qui doit vérifier s'il existe déjà un enregistrement dans la base de données et, dans le cas contraire, traiter certaines choses et éventuellement l'insérer, et simplement lire les données de la base de données si les données J'utilise une sous-classe de SQLiteOpenHelper pour créer et obtenir une instance réinscriptible de SQLiteDatabase, qui, je pense, s'est automatiquement chargée de créer la table si elle n'existait pas déjà (puisque le code à utiliser est dans 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 à query (...), mon logcat affiche une erreur de "I/Database (26434): sqlite retourné: error code = 1, msg = pas de table: appdata ", et la table appdata n’a pas été créée.

Des idées sur pourquoi?

Je cherche soit une méthode pour tester si la table existe (parce que si ce n'est pas le cas, les données n'y sont certainement pas, et je n'ai pas besoin de les lire avant d'y écrire, ce qui semble créer la table. correctement), ou un moyen de s’assurer qu’il est créé et qu’il est simplement vide, à temps pour le premier appel à query (...)

EDIT
Ceci a été posté après les deux réponses ci-dessous:
Je pense avoir 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 est onCreate peut fonctionner mieux ...

82
camperdave

Oui, la théorie dans mon édition était exacte: le problème qui empêchait la méthode onCreate de s'exécuter était le fait que les objets SQLiteOpenHelper devaient faire référence à des bases de données et ne pas en avoir un distinct pour chaque table. Le regroupement des deux tables dans un SQLiteOpenHelper a résolu le problème.

8
camperdave

Essaye celui-là:

public boolean isTableExists(String tableName, boolean openDb) {
    if(openDb) {
        if(mDatabase == null || !mDatabase.isOpen()) {
            mDatabase = getReadableDatabase();
        }

        if(!mDatabase.isReadOnly()) {
            mDatabase.close();
            mDatabase = getReadableDatabase();
        }
    }

    Cursor cursor = mDatabase.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;
}
118
Nikolay DS

Je ne connais rien à l'API SQLite Android), mais si vous parlez 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ève aucune erreur s'il existait déjà.

49
chrisbtoo

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;
11
AndroidDebaser

Bien qu'il y ait déjà beaucoup de bonnes réponses à cette question, j'ai proposé une autre solution que je pense 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!

10
robguinness
 // @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;
}
  • sqlite maintient la table sqlite_master contenant des informations sur toutes les tables et tous les index de la base de données.
  • Donc, ici, nous exécutons simplement la commande SELECT dessus, le curseur a le compte 1 si la table existe.
2
Akshansh singh

Vous avez mentionné que vous avez créé une classe qui étend SQLiteOpenHelper et implémenté la méthode onCreate. Vous assurez-vous que vous effectuez tous vos appels de base de données avec cette classe? Vous ne devriez obtenir que les objets SQLiteDatabase via les outils SQLiteOpenHelper#getWritableDatabase Et getReadableDatabase, sinon la méthode onCreate ne sera pas appelée si nécessaire. Si vous le faites déjà, vérifiez si la méthode SQLiteOpenHelper#onUpgrade 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 reconstitution de la base de données en vous assurant que toutes les connexions à celle-ci sont fermées et en appelant Context#deleteDatabase, Puis en utilisant SQLiteOpenHelper pour vous donner un nouvel objet de base de données.

2
Rich Schuler

no such table exists: error arrive car une fois que vous créez une base de données avec une table, chaque fois que vous créez une table dans la même base de données, cette erreur se produit.

Pour résoudre cette erreur, vous devez créer une nouvelle base de données. Dans la méthode onCreate (), vous pouvez créer plusieurs tables dans la même base de données.

0
Megha

Important la condition est SI PAS EXISTE vérifier que la table existe déjà ou non 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);
0
Pankaj Talaviya
 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;
}
0
Yogesh Rathi