1

私はコンテンツ プロバイダー/リゾルバーを使用しており、多数の 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 のキャストはありますか?

4

0 に答える 0