2013-03-13 143 views
26

我試試這個代碼如何獲取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'"

如何獲取所有表名?幫我提前

謝謝..

+2

是不是應該知道數據庫中表的名稱? – njzk2 2013-03-13 11:26:06

+0

我想動態創建表,而不是在數據庫中創建,因爲我想要在我的數據庫中存在表名。喜歡在mysql中的顯示錶 – Sandeep 2013-03-13 11:30:04

回答

52

經過,測試和運行。試試這個代碼:

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

謝謝悉達思的作品.. – Sandeep 2013-03-13 11:47:25

+0

@Sandeep:很高興能幫到你。:-) – 2013-03-13 11:48:04

+4

我不明白你的查詢有什麼不同? – njzk2 2013-03-13 13:38:09

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, 名文本, tbl_name TEXT, rootpage INTEGER, SQL文本 );

+0

謝謝:(但我已經創建了模式,但仍然不工作可以粘貼從sqlite數據庫獲取所有表名的代碼android – Sandeep 2013-03-13 11:38:16

+0

嘗試@Siddharth Lele提到的。他添加了一個條件,因爲你不知道如果你會收到任何結果,如果失敗,則替換遊標查詢:'Cursor c = db.rawQuery(「SELECT name FROM your_schema.sqlite_master WHERE type ='table'」,null);' – AlexBcn 2013-03-13 11:46:43

+0

謝謝,但我有已經嘗試使用my_schema.sqlite_master,但它沒有工作。並感謝您的寶貴迴應。 – Sandeep 2013-03-13 12:05:44

2

試試這個:

SELECT name FROM sqlite_master WHERE type = "table"; 
+0

我試過.. – Sandeep 2013-03-13 11:43:57

+11

這似乎只是在問題中的代碼片段。一般來說,從「試試這個「暗示響應者沒有自己嘗試。 – 2013-03-13 11:57:49

4

爲了得到表名與表中的所有列的列表

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

將您的sql字符串更改爲這一個:

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

相關問題