我在TABLE_CONTACT中有大约1500条记录。我获取联系人的代码:
Moq
问题是:我第一次运行此方法时,需要public ArrayList<SBContact> getAllContacts() {
SQLiteDatabase database = dbHelper.getWritableDatabase();
ArrayList<SBContact> mContacts = new ArrayList<SBContact>();
String selectQuery = "SELECT * FROM " + SBDatabaseHelper.TABLE_CONTACT;
Cursor cursor = database.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
do {
SBContact result = new SBContact(cursor.getString(cursor.getColumnIndex(SBDatabaseHelper.CONTACT_NUMBER)),
cursor.getString(cursor.getColumnIndex(SBDatabaseHelper.CONTACT_NAME)), cursor.getInt(cursor.getColumnIndex(SBDatabaseHelper.EXITS_USER)));
mContacts.add(result);
} while (cursor.moveToNext());
}
return mContacts;
}
。 5秒后我再次运行此方法,大约需要15ms
。
以类似的方式,在第一次通话后,15s之后,再次运行方法,大概需要20 seconds
。 2分钟后,再次运行此方法,第一次运行时需要10 seconds
。
此时,没有其他线程对数据库进行读/写查询。
我不明白15ms
的作用。是否需要时间释放内存或做某事?
EDITED
对不起,这不是SQLiteDatabase
的问题。有关此案例的详细信息,请参阅我的答案。
答案 0 :(得分:2)
每次查询后关闭光标
答案 1 :(得分:1)
对不起,我的错误。
此问题与SQLiteDatabase
无关。这是由于AsyncTask
问题。
我的情况是:我运行一个AsyncTask来从本地数据库(sqlite)获取联系,同时,我开始在这个AsyncTask中使用服务器(调用api需要很长时间)的新线程。当我运行AsyncTask再次获取联系人时(使用execute
方法),旧的AsyncTask仍然在运行,并且它阻止了新的运行。这就是新任务需要很长时间才能完成的原因。
我已经使用executeOnExecutor
方法修复了,方法的结果立即返回。
再一次,对不起所有人。