2011-09-15 57 views
14

你認爲從數據庫中獲取所有表名的正確方法並將它們添加到列表中,你認爲什麼?SQLite,如何獲取數據庫中的所有表名?

現在得到了遠:

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」,而不是我的表名的一些。所以猜猜查詢有問題。

謝謝!

回答

11

剛剛在FireFox中的SQLite管理器插件中做了一個快速測試,我正在使用SQLite數據庫,並且您正在使用的查詢確實返回表名。您是否正確創建表格,並且您是否測試了您的期望值?

要遍歷,這樣做:

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

是的,現在似乎工作,只輸出第一個作爲「android_metadata」,我是否忽略它? – Roger

+2

是的,把東西放在忽略第一行..你甚至可以把一個c.moveToNext()放在while()循環之前,或者明確地檢查它。 – 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); 
    } 
} 
相關問題