SQLite,如何获取数据库中所有表的名称?

14

你认为从数据库中获取所有表名并将它们添加到列表的正确方法是什么?

目前已经实现了这一步:

final ArrayList<String> dirArray = new ArrayList<String>();

SqlHelper sqlHelper = new SqlHelper(this, "TK.db", null, 1);
SQLiteDatabase DB = sqlHelper.getWritableDatabase();
Cursor c = DB.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null);

c.moveToFirst();
while (c.isAfterLast() == false) {
   dirArray.add("n" + c.getColumnIndex("name"));
   c.moveToNext();
 }
c.close();

但它输出的是 "android_metadata",而不是我的表名。所以我猜查询有些问题。

谢谢!

3个回答

11

我在使用Firefox中的SQLite Manager插件对我正在使用的SQLite数据库进行了快速测试,你所使用的查询确实可以返回表名。你是否正确创建了表格,并且是否按照预期进行了存在性测试?

要遍历,请执行以下操作:

    if (c.moveToFirst())
    {
        while ( !c.isAfterLast() ){
           dirArray.add( c.getString( c.getColumnIndex("name")) );
           c.moveToNext();
        }
    }

是的,现在似乎可以工作了,只输出第一个为“android_metadata”,我应该忽略它吗? - Roger
2
是的,在代码中加入一些内容来忽略第一行...你甚至可以在while()循环之前加入c.moveToNext(),或者显式地检查它。 - SBerg413

5

试一下这段代码

final ArrayList<String> dirArray = new ArrayList<String>();

SqlHelper sqlHelper = new SqlHelper(this, "TK.db", null, 1);
SQLiteDatabase DB = sqlHelper.getWritableDatabase();
Cursor c = DB.rawQuery("SELECT name FROM sqlite_master WHERE type='table'", null);
while(c.moveToNext()){
   String s = c.getString(0);
   if(s.equals("android_metadata"))
   {
     //System.out.println("Get Metadata");
     continue;
   }
   else
   {
      dirArray.add(s);
   }
 }

0
您也可以使用这个。
Cursor cursor = DB.getInstance(this).getAllTableNames();
if (cursor.moveToFirst()) {
    while (cursor.moveToNext()) {
        String tableName = cursor.getString(cursor.getColumnIndex("name"));
        Log.i(LOG_TAG, "..." + tableName);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接