アプリケーションにデータベース アクセスを実装するために、Lars Vogel のチュートリアルに従いましたが、いくつかの点で非常に混乱しています...
呼び出しが行われるたびに
fetchTodo
、新しいカーソルが作成されて返されます。ガベージ コレクターの前のカーソルを残します。それで、私が使用しない場合startManagingCursor
、またはそのことについては、カーソルでCursorLoader
a を呼び出す必要がありますか?.close()
もちろん範囲外fetchTodo
、例:カーソル cursor = mNotesAdapter.fetchTodo(); // 何かをする... cursor.close();
私はこのカーソルを使い果たし、次のフェッチで新しいカーソルが作成されます。このように閉じる必要がありますか、それともガベージ コレクターに残す必要がありますか? 私はまったく異なる2つのことについて話していると思いますが... ポイントは、上記の例のように閉じる必要がありますか?
Cursor
メソッドも.deactivate()
あり、ドキュメントには、(アクティブカーソルよりも)使用するリソースが少ないと書かれています。いつこれを使用する必要がありますか?たとえば、私のアプリでは、ListActivity
を介して入力される がありSimpleCursorAdapter
ます (このコードの初期化は 1 回だけ呼び出されます)。使用されているカーソルはクラス メンバー変数です。これは、リストにデータを入力するメソッドの外でカーソルが必要だからです。データベースから何かが削除されたときにデータベースを再クエリするために必要です。しかし、レコードが削除されるまで、これはユーザー アクションであり、発生するまでに時間がかかる場合があります。その間、カーソルを無効にする必要がありますか? もう一度呼び出すと、.requery()
再びアクティブになるからです。または、SimpleCursorAdapter
カーソルがアクティブでないために動作を停止しますか?
編集:deactivate()
これをテストしたところ、カーソルアダプターをセットアップした後に呼び出すことができないことがわかりました。カーソルがアクティブでない場合、リストは空になるため、ListActivity が表示されている限り、カーソルをアクティブにしておく必要があります。結局、それをStartManagingCursor
処理するだけです。または新しいCursorLoader
。
startManagingCursor
/が非推奨であることはわかっていstopManagingCursor
ますが、(少なくとも当面は) Honeycomb をターゲットにしておらずCursorLoader
、今のところ新しいものを扱いたくありません。しかし、上記のチュートリアルでstartManagingCursor
は、どこでも使用されていますが、stopManagingCursor
一度も呼び出されていません。なぜだめですか?Androidは独自の方法でそれを処理しますか? 私が電話すべき状況はありますstopManagingCursor
か?