web-dev-qa-db-ja.com

Android sqliteデータベースのすべてのテーブル名を取得する方法?

私はこのコードを試してみました

_ 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();

}
_

しかし、それはエラー"Android.database.sqlite.SQLiteException: no such table: sqlite_master(code 1):,while compiling: SELECT name FROM sqlite_master WHERE type='table'"をスローします

すべてのテーブル名を取得する方法は?助けて

前もって感謝します..

35
Sandeep

チェック、テスト、機能します。このコードを試してください:

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();
    }
}

行の下のある時点で、テーブル名のリストを取得して、おそらくListViewまたは何かで表示すると仮定しています。トーストを表示するだけではありません。

テストされていないコード。頭に浮かんだのは、本番アプリで使用する前にテストすることです。;-)

その場合、上記のコードに対する次の変更を検討してください。

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

SQL文字列を次のように変更します。

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

10
DawnYu

そのテーブルのすべての列のリストテーブル名を取得するには

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

テーブルの前にスキーマを追加してみてください

schema.sqlite_master

SQL FAQ から

Sqlite3コマンドラインアクセスプログラムを実行している場合は、「。tables」と入力してすべてのテーブルのリストを取得できます。または、「。schema」と入力して、すべてのテーブルとインデックスを含む完全なデータベーススキーマを表示できます。これらのコマンドのいずれかに、表示されるテーブルを制限するLIKEパターンを続けることができます。

C/C++プログラム(またはTcl/Ruby/Perl/Pythonバインディングを使用するスクリプト)から、「SQLITE_MASTER」という名前の特別なテーブルでSELECTを実行することで、テーブル名とインデックス名にアクセスできます。すべてのSQLiteデータベースには、データベースのスキーマを定義するSQLITE_MASTERテーブルがあります。 SQLITE_MASTERテーブルは次のようになります。

CREATE TABLE sqlite_master(タイプTEXT、名前TEXT、tbl_name TEXT、ルートページINTEGER、sql TEXT);

5
AlexBcn

これを試して:

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