何时关闭SimpleCursorAdapter中使用的Cursor

时间:2014-09-30 20:03:16

标签: android simplecursoradapter searchview android-cursor

我正在使用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是否真的自动关闭光标?

提前致谢。

4 个答案:

答案 0 :(得分:6)

  1. 完成后,您需要关闭光标。在setAdapter()调用之后关闭它会阻止适配器访问数据。因此,关闭光标的更好位置是在当前活动中拆除生命周期阶段,例如onPause()或onStop()。 (onDestroy()不应该被使用,因为Android运行时不保证调用它。我认为最新版本onStop()是保证的)
  2. 我不认为SimpleCursorAdapter适配器会自动自动关闭光标。官方文档提到changeCursor()会自动关闭旧光标,因此另一个选项可能是在搜索后更改光标。 http://developer.android.com/reference/android/widget/CursorAdapter.html#changeCursor(android.database.Cursor)

答案 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)