【问题标题】:How to get all table names in android sqlite database?如何获取android sqlite数据库中的所有表名?
【发布时间】:2013-03-01 07:13:48
【问题描述】:

我试过这个代码

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

如何获取所有表名?

【问题讨论】:

  • 你不应该知道数据库中表的名称吗?
  • 我想动态创建未在数据库中创建的表,因为我想在我的数据库中现有表名。像在mysql中显示表

标签: java android sqlite


【解决方案1】:

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

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 或其他内容中。不只是显示 Toast。

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

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

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

【讨论】:

  • @Sandeep:很高兴我能帮上忙。 :-)
  • 我不明白您的查询有何不同?
  • Hello Folks @siddharthLele 查询也适用于 iOS Sqlite,例如 FMResultSet *s=[database executeQuery:@"SELECT name FROM sqlite_master WHERE type='table'"]; while ([s next]) { NSLog(@"%@",[s stringForColumn:@"name"]); } 并按字符串名称进行迭代。快乐编码
  • @Pilpel:我看不出有什么遗漏。如果您已经测试并发现缺少某些东西,请告诉我,我会修复它。
【解决方案2】:

把你的 sql 字符串改成这个:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      尝试在表格前添加架构

      schema.sqlite_master

      来自SQL FAQ

      如果您正在运行 sqlite3 命令行访问程序,您可以键入“.tables”来获取所有表的列表。或者您可以键入“.schema”来查看完整的数据库架构,包括所有表和索引。这些命令中的任何一个都可以后跟一个 LIKE 模式,该模式将限制显示的表。

      在 C/C++ 程序(或使用 Tcl/Ruby/Perl/Python 绑定的脚本)中,您可以通过对名为“SQLITE_MASTER”的特殊表执行 SELECT 来访问表和索引名称。每个 SQLite 数据库都有一个 SQLITE_MASTER 表,用于定义数据库的架构。 SQLITE_MASTER 表如下所示:

      创建表 sqlite_master ( 输入文本, 名称文本, tbl_name 文本, 根页整数, sql 文本 );

      【讨论】:

      • 谢谢 :( 但我已经创建了架构但仍然无法工作您能否粘贴从 sqlite 数据库 android 获取所有表名的代码
      • 试试@Siddharth Lele 提到的。他添加了一个条件,因为您不知道您是否会收到任何结果。如果失败则替换游标查询:Cursor c = db.rawQuery("SELECT name FROM your_schema.sqlite_master WHERE type='table'", null);
      • 谢谢,但我已经尝试过使用 my_schema.sqlite_master 但它不起作用。并感谢您的宝贵回复。
      【解决方案5】:

      试试这个:

      SELECT name FROM sqlite_master WHERE type = "table";
      

      【讨论】:

      • 这似乎只是问题中代码的一部分。一般来说,以“试试这个”开头表示响应者没有自己尝试。
      【解决方案6】:

      我用 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()
         }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-11-17
        • 2016-08-14
        • 1970-01-01
        • 1970-01-01
        • 2011-02-16
        • 2011-09-07
        • 1970-01-01
        • 2011-04-30
        • 2011-02-17
        相关资源
        最近更新 更多