SQLiteOpenHelper を拡張する DatabaseHelper クラスでは、DatabaseHelper 以外のクラス内でクエリを実行しないように、Cursors を他のアクティビティに返すさまざまなメソッドを設定しました。これらのメソッドでは、後でカーソルまたはデータベースを閉じず、次のように返します。
public Cursor getCoursesLeft()
{
// Open a readable database.
SQLiteDatabase database = this.getReadableDatabase();
// Query the database and return the cursor.
return database.query(DEGREE_PLAN_TABLE, null, DEGREE_COLUMN_TAKEN + " = ?",
new String[] { "0" }, null, null, DEGREE_COLUMN_CLASS_NAME + " COLLATE NOCASE");
}
どのアクティビティからメソッドを呼び出しても、使用後に返された Cursor を必ず閉じます。
Cursor はオブジェクトなので、参照渡しする必要がありますね。したがって、他のアクティビティから閉じると元のオブジェクトが閉じられるはずです。正しく理解できれば、カーソルを閉じるとデータベースも閉じます。
これは悪いコーディング方法ですか?
データベースで close が呼び出されなかったことを示す LogCat エラーがランダムに発生するようです。コードで見つけられる理由は、これらのメソッドでカーソルを返す方法だけです。