41

我试过这段代码

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'"

如何获取所有表名?

4

6 回答 6

77

检查、测试和运行。试试这个代码:

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

我假设,在某个时刻,您将获取表名列表以显示在 aListView或其他内容中。不只是展示吐司。

未经测试的代码。正是我想到的。在生产应用程序中使用它之前进行测试。;-)

在这种情况下,请考虑对上面发布的代码进行以下更改:

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();
        }
    }
于 2013-03-13T11:39:35.160 回答
11

将您的 sql 字符串更改为此:

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

于 2015-09-09T03:12:21.873 回答
7

获取包含该表所有列列表的表名

    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);
            }
}
于 2015-08-17T12:46:58.437 回答
5

尝试在表格之前添加架构

schema.sqlite_master

来自SQL 常见问题

如果您正在运行 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);

于 2013-03-13T11:33:03.413 回答
2

试试这个:

SELECT name FROM sqlite_master WHERE type = "table";
于 2013-03-13T11:33:53.520 回答
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()
   }
}
于 2021-06-01T15:33:42.643 回答