我需要计算当前在我的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_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';
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()中关闭它.
归档时间: |
|
查看次数: |
11198 次 |
最近记录: |