我正在使用SimpleCursorAdapter在ListView中显示结果,但由于我在搜索过程中需要多次查询我的数据库(使用SearchView小部件),因此我担心光标可能会被打开。
这就是我查询数据库并在ListView中显示结果的方法:
class SearchCustomers extends AsyncTask<String,Void,Cursor>{
@Override
protected Cursor doInBackground(String... params) {
//get the query
String query=params[0].toLowerCase(Locale.getDefault());
Cursor cursor=mDB.searchCustomersByName((query != null ? query : "@@@@"));
return cursor;
}
@Override
protected void onPostExecute(Cursor result) {
if (result != null) {
String[] from = new String[] { QuickOrderDB.ID,
QuickOrderDB.NAME,
QuickOrderDB.ADDRESS,
QuickOrderDB.PHONE_NUMBER };
int[] to = new int[] { R.id.customerIDTextView,
R.id.customerNameTextView,R.id.customerAddressTextView ,
R.id.customerPhoneTextView };
SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(SearchCustomersActivity.this,
R.layout.results_customer_item, result, from, to);
mResultsListView.setAdapter(cursorAdapter);
}
}
}
我已经尝试了很多东西来关闭光标,但即使我在mResultsListView.setAdapter(cursorAdapter);
之后关闭它,结果仍然是相同的:一个空的ListView 。
我已经看到了一些问题,其中提到光标将自动关闭,但我想确保这是真的。
有关于此的官方文件吗? SimpleCursorAdapter是否真的自动关闭光标??
提前致谢。
答案 0 :(得分:6)
答案 1 :(得分:2)
如果使用CursorLoader而不是AsyncTask获取Cursor会更好。 Loaders通过LoaderManager与Activity / Fragment生命周期同步,系统将在需要时自动关闭CursorLoader提供的Cursor。
答案 2 :(得分:0)
您应该关闭片段或活动的onPause()
回调中的光标。暂停活动后,较旧的Android系统可能会删除该应用以释放内存。
这意味着您需要在相应的onResume()
回调中重新建立游标。
答案 3 :(得分:-3)
不要为游标创建变量,只需将db查询直接添加到constructor作为参数 c
,db.query()
或一个包含所需查询的方法),这似乎有效。
SimpleCursorAdapter (Context context,
int layout,
Cursor c,
String[] from,
int[] to,
int flags)