我需要计算当前在我的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.此方法可能出错。有没有直接的方法来计算。
答案 0 :(得分:18)
您的方法很好,您甚至可以使用SELECT count(*) ...
。但是有两个表自动创建android_metadata
和sqlite_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放置如图所示。