如何在android sqlite数据库中获取所有表名?

时间:2013-03-13 11:20:49

标签: java 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'"

如何获取所有表名?帮帮我

提前致谢..

6 个答案:

答案 0 :(得分:67)

检查,测试和运作。试试这段代码:

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

答案 1 :(得分:9)

将您的sql字符串更改为:

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

答案 2 :(得分:6)

使用该表的所有列列表表名

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

答案 3 :(得分:5)

尝试在表

之前添加架构

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,     rootpage INTEGER,     sql TEXT   );

答案 4 :(得分:2)

试试这个:

SELECT name FROM sqlite_master WHERE type = "table";

答案 5 :(得分:0)

我用 Kotlin 和 Room 测试了 Siddharth Lele 的答案,它也能正常工作。

相同的代码,但使用 Kotlin 和 Room 是这样的:

val cursor = roomDatabaseInstance.query(SimpleSQLiteQuery("SELECT name FROM sqlite_master WHERE type='table' AND name NOT IN ('android_metadata', 'sqlite_sequence', 'room_master_table')"))
val tableNames = arrayListOf<String>()
if(cursor.moveToFirst()) {
   while (!cursor.isAfterLast) {
      tableNames.add(cursor.getString(0))
      cursor.moveToNext()
   }
}