私はコンテンツ プロバイダー/リゾルバーを使用しており、多数の DB ヘルパー メソッドを提供する別のプロジェクト/ライブラリを持っています。カーソルで便利なことを行う2番目のプロジェクト/ライブラリがあります。
そのような DB ヘルパー メソッド (com.example.DBHelper) を想像してください。
public String[] dumpColumnTable() {
Cursor cursor = cr.query(MY_URI,
new String[] { FIELD },
null,
null,
null
);
return UtilMethods.createArrayFromCursor(cursor);
}
次に、Util メソッド (com.example.UtilMethods):
public static String[] createArrayFromCursor(Cursor cursor) {
return createArrayFromCursor(cursor, 0);
}
public static String[] createArrayFromCursor(Cursor cursor, int column) {
if (cursor == null) return null;
String[] strings = new String[cursor.getCount()];
if (cursor.moveToFirst()) {
int i=0;
do {
strings[i] = cursor.getString(column);
i++;
} while (cursor.moveToNext());
}
return strings;
}
明らかに、カーソルは閉じていません。これにより、カーソルがリークします。Logcat はそのメッセージを表示します。
SO、内部の util 関数で閉じます。
public static String[] createArrayFromCursor(Cursor cursor, int column) {
if (cursor == null) return null;
String[] strings = new String[cursor.getCount()];
if (cursor.moveToFirst()) {
int i=0;
do {
strings[i] = cursor.getString(column);
i++;
} while (cursor.moveToNext());
}
cursor.close();
return strings;
}
ただし、logcat は、ファイナライズ前にカーソルが閉じられていないと主張します。
代わりに、DB ヘルパー メソッドで戻り値を保存し、カーソルを閉じてから返すと、カーソル リーク/logcat メッセージは表示されません。
public String[] dumpColumnTable() {
Cursor cursor = cr.query(MY_URI,
new String[] { FIELD },
null,
null,
null
);
String[] toret = UtilMethods.createArrayFromCursor(cursor);
cursor.close();
return toret;
}
なんで ?デバッグでは、呼び出しが戻ると、カーソルはクローズとしてマークされます。コール スタックは、アクティビティ -> db ヘルパー -> util メソッドから取得されます。db ヘルパーと util メソッドは、アクティビティとは別のプロジェクトにあります。
欠落している参照/値によるパスの問題、または複数の JAR 境界を越えているもの、または欠落しているジェネリック Cursor タイプへの SQLiteCursor のキャストはありますか?