我使用内容提供程序/解析程序,有一个单独的项目/ lib,它提供了许多DB帮助程序方法。我有一个第二个项目/ lib,用光标做一些方便的东西。
想象一下这样的DB Helper方法(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会给你那条消息。
所以,在内部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 Helper方法中,我保存返回值,关闭游标,然后返回它,我得到没有游标泄漏/ 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;
}
为什么?在调试中,当调用返回时,光标被标记为关闭。调用堆栈来自我的activity-> db helper-> util方法。 db helper和util方法与活动位于不同的项目中。
是否存在一些通过引用/值问题的传递我缺少,或者跨越多个JAR边界,或者将SQLiteCursor转换为我缺少的通用Cursor类型?