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