计算sqlite数据库中的表数

dar*_*rsh 8 sqlite android

我需要计算当前在我的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;
}
Run Code Online (Sandbox Code Playgroud)

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

Sam*_*Sam 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';
Run Code Online (Sandbox Code Playgroud)

一些缩短代码的指针

所有这些:

cursor.moveToFirst();
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
Run Code Online (Sandbox Code Playgroud)

可以像这样完成:

while(cursor.moveToNext()) {
Run Code Online (Sandbox Code Playgroud)

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

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

int count = cursor.getCount();
Run Code Online (Sandbox Code Playgroud)

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

getReadableDatabase().close();
Run Code Online (Sandbox Code Playgroud)

我没有测试过这一点,但如果getReadableDatabase()返回一个新的SQLiteDatabase每次对象,那么你只是一旦你已经创造了它关闭这个新的数据库...我会关闭数据库一次,我会关闭它后,我关闭了从中检索到的所有游标.

SQLiteDatabase database = getReadableDatabase();
...

database.close();
Run Code Online (Sandbox Code Playgroud)

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

  • 需要考虑的一件事(来自SQLite文档)*"只要创建包含AUTOINCREMENT列的普通表,就会自动创建并初始化sqlite_sequence表."*.尽管使用`AUTOINCREMENT`很常见,但该语句表明如果没有表使用它,那么`sqlite_sequence`将不存在.理想情况下,OP还需要循环遍历游标行集并比较表名 - 我知道PITA,但这是100%确定的唯一方法. (2认同)