我已经实施了一项应用,其活动使用searchview
中的actionbar
。
事情是,在现代设备上开发和测试(android 4.4)我从来没有遇到任何问题,但现在我已经在Android 3.0或Android 4.0的某些设备上测试了应用程序,应用程序有时会在搜索时崩溃并给我这个例外:
E/AndroidRuntime(457): Caused by: java.lang.IllegalStateException: database /data/data/com.ss.quicorder/databases/QuickOrder.db (conn# 0) already closed
11-25 11:44:37.864: E/AndroidRuntime(457): at android.database.sqlite.SQLiteDatabase.verifyDbIsOpen(SQLiteDatabase.java:2117)
这是我用来搜索的代码:
searchView.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String query) {
if (!query.isEmpty() && query.trim().length()>0) {
displayResults(query);
}
else{
mResultsListView.setAdapter(null);
}
return false;
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
});
displayResults 函数只执行AsyncTask:
private void displayResults(String query) {
new sSearchCustomers().execute(query);
}
AsyncTask 查询数据库:
class SearchCustomers extends AsyncTask<String, Void, Cursor> {
@Override
protected Cursor doInBackground(String... params) {
// get the query
String stringToDisplay = params[0].toLowerCase(Locale.getDefault());
String stringToSearch = Normalizer.normalize(stringToDisplay,
Normalizer.Form.NFC);
Cursor resultados = SearchCustomersActivity.this.mDB
.searchCustomersByName((stringToSearch != null ? stringToSearch
: "@@@@"));
return resultados;
}
@Override
protected void onPostExecute(Cursor result) {
if (result != null) {
String[] from = new String[] {
QuickOrderDB.CUSTOMER_NAME,
QuickOrderDB.CUSTOMER_ADDRESS };
int[] to = new int[] {
R.id.nameTextView,
R.id.addressTextView};
SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(
SearchCustomersActivity.this,
R.layout.customer_results_item, result, from, to,0);
mResultsListView.setAdapter(cursorAdapter);
}
}
}
这是 searchCustomersByName 的代码:
public Cursor searchCustomersByName (String name {
String where = CUSTOMER_NAME_NORM + " LIKE ? ";
String[] whereArgs = { "%" + descripcion + "%"};
this.openReadableDB();
Cursor cursor = db.query(CUSTOMER_TABLE, null, where, whereArgs, null,
null, null);
if (cursor != null) {
cursor.moveToFirst();
}
this.closeDB();
return cursor;
}
正如您在 searchCustomersByName 的代码中看到的,每次我返回Cursor
时我都会关闭数据库,但我不确定是否执行{{1}对于用户键入的每个单个字母,它导致了这个问题,我的意思是,是否有一个AsyncTask关闭数据库而另一个执行查询的可能性。 Aren他们应该按顺序执行 ??此外,永远无法关闭光标的事实让我很担心。
与往常一样,任何想法或建议都将受到高度赞赏。
感谢。