1

我在这里找到了在 SQLite 中获取所有表的解决方案。 如何列出使用 ATTACH 打开的 SQLite 数据库文件中的表? 但是,当我改变时:

SELECT name FROM sqlite_master WHERE type='table';

进入:

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

输出完全奇怪。第一个查询给我:tbl201306 --> 到目前为止只有一个表,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;
}
4

2 回答 2

1

您的代码会跳过第一个返回的记录。

你可以

  • 保持对 的调用moveToFirst(),并将循环更改为do { ... } while ();循环,或
  • 只需删除对moveToFirst().
于 2013-06-13T06:51:33.343 回答
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;
}
于 2013-06-13T13:51:00.327 回答