计算sqlite数据库中的表数

时间:2012-07-16 14:32:56

标签: android sqlite

我需要计算当前在我的sqlite数据库中的表。尝试搜索但没有得到任何直接的方法。

我在DbHelper中试过这个方法。

public int countTables() {
    int count = 0;
    String SQL_GET_ALL_TABLES = "SELECT * FROM sqlite_master WHERE type='table'";
    Cursor cursor = getReadableDatabase()
            .rawQuery(SQL_GET_ALL_TABLES, null);
    cursor.moveToFirst();
    for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {

        count++;
        getReadableDatabase().close();

    }
    cursor.close();
    return count;
}

但这种方法给了我一个错误的计数。我的数据库中只有3个表,但此方法将计数返回为5.此方法可能出错。有没有直接的方法来计算。

3 个答案:

答案 0 :(得分:18)

您的方法很好,您甚至可以使用SELECT count(*) ...。但是有两个表自动创建android_metadatasqlite_sequence,只需考虑这些:5 - 2 =您创建的3个表。

或者,由于Squonk提供了关于何时创建sqlite_sequence以及何时存在的优秀文档,我推荐此查询:

SELECT count(*) FROM sqlite_master WHERE type = 'table' AND name != 'android_metadata' AND name != 'sqlite_sequence';

一些缩短代码的指示

所有这一切:

cursor.moveToFirst();
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {

可以这样完成:

while(cursor.moveToNext()) {

如果下一行存在,Cursor.moveToNext()将返回true。如果新游标不为空,则moveToNext()将返回true并在第一个位置设置此索引。当cursor.isAfterLast() == true时,moveToNext()返回false。

但是如果您只想计算Cursor使用的行数:

int count = cursor.getCount();

最后,将可写数据库存储在变量中。

getReadableDatabase().close();

我没有测试过这个,但是如果getReadableDatabase()每次都返回一个新的SQLiteDatabase对象,那么只要你创建它就关闭这个新数据库...我会关闭数据库一次< / em>我会在之后关闭它我已经关闭了从中检索到的所有游标。

SQLiteDatabase database = getReadableDatabase();
...

database.close();

如果您使用了大量查询,请考虑在onResume()中打开数据库并在onPause()中关闭它。

答案 1 :(得分:1)

查找计数和表名

找到计数

ResultSet rs = st.executeQuery("select count(*) from sqlite_master as tables where type='table'");
System.out.println(rs.getInt(1));

检索表名

ResultSet rs2 = st.executeQuery("select name from sqlite_master as tables where type='table'");
    while(rs2.next())
    {
          String tid = rs2.getString(1);
          System.out.println(tid);
    }
    rs.close();

答案 2 :(得分:0)

尝试

              vvvvvv
SELECT * FROM YourDataBaseName.sqlite_master WHERE type='table';

只需将DatabseName放置如图所示。