2013-06-13 69 views
1

我發現解決方案來獲取SQLite中的所有表。 How to list the tables in an SQLite database file that was opened with ATTACH? 但是,當我改變:SQLite選擇所有表DESC

SELECT name FROM sqlite_master WHERE type='table'; 

到:

SELECT name FROM sqlite_master WHERE type='table' ORDER BY name DESC; 

輸出是完全不可思議。 第一個查詢給我: tbl201306 - >目前爲止只有1個表,2013年6月。 第二個查詢給我: android_metadata - >名稱沒有改變,但是它返回這個名字。

我希望這些表格按降序排列,因爲將來,最新的表格會位於最前面。

我的完整代碼:

public ArrayList<String> getDBTables() { 
    ArrayList<String> toReturn = new ArrayList<String>(); 
    try { 
     Cursor c = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name DESC", null); 
     c.moveToFirst(); 

     while (c.moveToNext()) { 
      toReturn.add(c.getString(c.getColumnIndex("name"))); 
     } 
     c.close(); 
    } 
    catch(SQLiteException e) { 
     e.printStackTrace(); 
    } 
    return toReturn; 
} 
+0

哇,這並沒有太大的意義。這看起來像有效的代碼。你的SQL行在我的數據庫上運行良好。 – HalR

+0

當我有這種奇怪的東西發生時,我嘗試「現實檢查」。如果你改回第一行,它還能工作嗎?你的數據庫可能會搞砸了。其他「絕望」措施包括刪除當前字符串,重新輸入字符串,並對項目進行完全乾淨的重建,包括首先從設備中刪除它。 – HalR

+0

你有什麼問題?該查詢返回兩條記錄。名字按降序排列。你能指望什麼?數據庫中有更多表嗎? – cha

回答

1

您的代碼跳過第一個返回的記錄。

您可以

  • 保持通話,以moveToFirst(),並改變環成do { ... } while();循環,或
  • 只是刪除調用moveToFirst()
+0

你是對的!顯然android_metadata表是自動生成的。所以有兩張桌子,我跳過了第一張桌子。 –

0

這是我用過的終極解決方案:

public ArrayList<String> getDBTables() { 
    ArrayList<String> toReturn = new ArrayList<String>(); 
    try { 
     Cursor c = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table' AND name LIKE 'tbl%' ORDER BY name DESC", null); 
     while(c.moveToNext()) { 
      toReturn.add(c.getString(c.getColumnIndex("name"))); 
     } 
     c.close(); 
    } 
    catch(SQLiteException e) { 
     e.printStackTrace(); 
    } 
    return toReturn; 
}