Подсчет количества таблиц в базе данных 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 ответов


ваш метод в порядке, вы даже можете использовать SELECT count(*) .... Но есть две таблицы, созданные автоматически android_metadata и sqlite_sequence, просто учитывает это: 5-2 = 3 таблицы, которые вы создали.

или поскольку Squonk предоставил отличную документацию о том, когда sqlite_sequence создается и когда это может не exist, я рекомендую этот запрос:

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()) {

курсор.moveToNext () возвращает true, если существует следующая строка. Если новый курсор не пуст, moveToNext () вернет true и установит этот индекс на первую позицию. Когда cursor.isAfterLast() == true, moveToNext() возвращает false.

но если вы просто хотите подсчитать, сколько строк в использовании Курсора:

int count = cursor.getCount();

наконец, сохраните вашу записываемую базу данных в переменной.

getReadableDatabase().close();

I не проверяли это, но если getReadableDatabase () возвращает новый объект SQLiteDatabase каждый раз, то вы просто закрываете эту новую базу данных, как только вы ее создали... Я бы закрыл базу данных после и я бы закрыл его после я закрыл все курсоры, которые я извлек из этого.

SQLiteDatabase database = getReadableDatabase();
...

database.close();

если вы используете много запросов, подумайте об открытии базы данных в onResume() и закрытии ее в onPause().


найти количество и имена таблиц

найти графа

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();

попробовать

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

просто поместить свои DatabseName как показано на рисунке.