2013-06-13 36 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; 
}