web-dev-qa-db-fra.com

Comment obtenir tous les noms de table dans la base de données Android sqlite?

J'ai essayer ce code

 Cursor c=db.rawQuery("SELECT name FROM sqlite_master WHERE type = 'table'",null);

 c.moveToFirst();

 while(!c.isAfterLast()){

Toast.makeText(activityName.this, "Table Name=> "+c.getString(0), Toast.LENGTH_LONG).show();

}

mais cela génère une erreur "Android.database.sqlite.SQLiteException: no such table: sqlite_master(code 1):,while compiling: SELECT name FROM sqlite_master WHERE type='table'"

Comment récupérer tous les noms de table? Aidez moi

Merci d'avance..

35
Sandeep

Vérifié, testé et fonctionnel. Essayez ce code:

Cursor c = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null);

if (c.moveToFirst()) {
    while ( !c.isAfterLast() ) {
        Toast.makeText(activityName.this, "Table Name=> "+c.getString(0), Toast.LENGTH_LONG).show();
        c.moveToNext();
    }
}

Je suppose, à un moment donné, que vous saisirez une liste des noms de table pour afficher peut-être un ListView ou quelque chose. Pas seulement montrer un toast.

Code non testé. Juste ce qui m'est venu à l'esprit. Faites un test avant de l'utiliser dans une application de production.; -)

Dans ce cas, tenez compte des modifications suivantes apportées au code publié ci-dessus:

ArrayList<String> arrTblNames = new ArrayList<String>();
Cursor c = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null);

    if (c.moveToFirst()) {
        while ( !c.isAfterLast() ) {
            arrTblNames.add( c.getString( c.getColumnIndex("name")) );
            c.moveToNext();
        }
    }
68
Siddharth Lele

Changez votre chaîne sql en celle-ci:

"SELECT name FROM sqlite_master WHERE type='table' AND name!='Android_metadata' order by name"

10
DawnYu

Pour obtenir nom de la table avec liste de toutes les colonnes de cette table

public void getDatabaseStructure(SQLiteDatabase db) {

        Cursor c = db.rawQuery(
                "SELECT name FROM sqlite_master WHERE type='table'", null);
        ArrayList<String[]> result = new ArrayList<String[]>();
        int i = 0;
        result.add(c.getColumnNames());
        for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
            String[] temp = new String[c.getColumnCount()];
            for (i = 0; i < temp.length; i++) {
                temp[i] = c.getString(i);
                System.out.println("TABLE - "+temp[i]);


                Cursor c1 = db.rawQuery(
                        "SELECT * FROM "+temp[i], null);
                c1.moveToFirst();
                String[] COLUMNS = c1.getColumnNames();
                for(int j=0;j<COLUMNS.length;j++){
                    c1.move(j);
                    System.out.println("    COLUMN - "+COLUMNS[j]);
                }
            }
            result.add(temp);
        }
6
Siddhpura Amit

Essayez d'ajouter le schéma avant la table

schema.sqlite_master

De FAQ SQL

Si vous exécutez le programme d'accès en ligne de commande sqlite3, vous pouvez taper ".tables" pour obtenir une liste de toutes les tables. Ou vous pouvez taper ".schema" pour voir le schéma complet de la base de données, y compris toutes les tables et les index. L'une ou l'autre de ces commandes peut être suivie d'un modèle LIKE qui restreindra les tables affichées.

À partir d'un programme C/C++ (ou d'un script utilisant les liaisons Tcl/Ruby/Perl/Python), vous pouvez accéder aux noms de table et d'index en effectuant un SELECT sur une table spéciale nommée "SQLITE_MASTER". Chaque base de données SQLite possède une table SQLITE_MASTER qui définit le schéma de la base de données . La table SQLITE_MASTER ressemble à ceci:

CREATE TABLE sqlite_master (type TEXT, nom TEXT, tbl_name TEXT, rootpage INTEGER, sql TEXT);

5
AlexBcn

Essaye ça:

SELECT name FROM sqlite_master WHERE type = "table";
2
Damien R.