3

このアプリをテストするたびに、「データベース [パス] の SQLiteConnection オブジェクトがリークされました! アプリケーションを修正して、進行中のトランザクションを適切に終了し、不要になったときにデータベースを閉じるようにしてください。 "

SO でこのメッセージに対処する他の質問を見てきましたが、どの回答も私の状況に合っているとは思いません。1 つには、私のデータベースへのアクセスはすべてコンテンツ プロバイダーを介して行われます。もう 1 つの例として、複数のデータベース (どちらもリークされます) と、データベースの 1 つからのデータを保持する多数のカーソルを扱っています。

コンテンツ プロバイダーを投稿しますが、コンテンツ プロバイダーの長さは 1200 行です。どの部分を選択する必要があるか教えてください。それらを編集します。関連する場合は、コンテンツ プロバイダーに SQLiteOpenHelper 内部クラスがあります。それ以外の場合は、この問題を引き起こしていると思われるアクティビティの一部を次に示します。

private SimpleCursorAdapter setFixedSpinnerAdapter(String table, String[] columns){
        Uri uri = Uri.parse(DBContentProvider.CONTENT_URI_OPTION + table);
        String sortOrder = (columns.length > 2 ? columns[2] : columns[1]);
        //if 3rd column specified, use it for sorting
        Cursor cursor = getContentResolver().query(uri, columns, null, null, sortOrder);
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_dropdown_item, 
                cursor, new String[]{cursor.getColumnName(1)}, new int[]{android.R.id.text1}, 0);
        return adapter;
    }// method: setFixedSpinnerAdapter(String, String[])    

このコードは複数の Spinner によって呼び出され、それらに入力されるデータの行を取得します。ご参考までに、カーソルは閉じませんが、アダプター内のデータを失わずにカーソルを閉じる方法が見つかりませんでした。

ですから、あなたのアイデアや、コンテンツ プロバイダに含めるべき部分の提案があれば教えてください。

編集:ここにlogcatがあります

07-15 13:24:42.162: W/SQLiteConnectionPool(7394): A SQLiteConnection object for database '+data+data+edu_dordt_grassrootsplantid+databases+plant_identification_local' was leaked!  Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.
07-15 13:24:42.162: W/SQLiteConnectionPool(7394): A SQLiteConnection object for database '+data+data+edu_dordt_grassrootsplantid+databases+plant_identification_local' was leaked!  Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.
07-15 13:24:42.162: W/SQLiteConnectionPool(7394): A SQLiteConnection object for database '+data+data+edu_dordt_grassrootsplantid+databases+plant_identification_local' was leaked!  Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.
07-15 13:24:42.162: W/SQLiteConnectionPool(7394): A SQLiteConnection object for database '+data+data+edu_dordt_grassrootsplantid+databases+plant_identification_local' was leaked!  Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.
07-15 13:24:42.162: W/SQLiteConnectionPool(7394): A SQLiteConnection object for database '+data+data+edu_dordt_grassrootsplantid+databases+plant_identification_local' was leaked!  Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.
07-15 13:24:42.162: W/SQLiteConnectionPool(7394): A SQLiteConnection object for database '+data+data+edu_dordt_grassrootsplantid+databases+plant_identification_local' was leaked!  Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.
07-15 13:24:42.170: W/SQLiteConnectionPool(7394): A SQLiteConnection object for database '+data+data+edu_dordt_grassrootsplantid+databases+plant_identification_local' was leaked!  Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.
07-15 13:24:42.170: W/SQLiteConnectionPool(7394): A SQLiteConnection object for database '+data+data+edu_dordt_grassrootsplantid+databases+plant_identification_local' was leaked!  Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.
07-15 13:24:42.170: W/SQLiteConnectionPool(7394): A SQLiteConnection object for database '+data+data+edu_dordt_grassrootsplantid+databases+plant_identification_local' was leaked!  Please fix your application to end transactions in progress properly and to close the database when it is no longer needed.
07-15 13:24:42.170: W/CursorWrapperInner(7394): Cursor finalized without prior close()
07-15 13:24:42.178: W/CursorWrapperInner(7394): Cursor finalized without prior close()
07-15 13:24:42.178: W/CursorWrapperInner(7394): Cursor finalized without prior close()
07-15 13:24:42.178: W/CursorWrapperInner(7394): Cursor finalized without prior close()
07-15 13:24:42.178: W/CursorWrapperInner(7394): Cursor finalized without prior close()
07-15 13:24:42.178: W/CursorWrapperInner(7394): Cursor finalized without prior close()
07-15 13:24:42.178: W/CursorWrapperInner(7394): Cursor finalized without prior close()
07-15 13:24:42.178: W/CursorWrapperInner(7394): Cursor finalized without prior close()
07-15 13:24:42.186: W/CursorWrapperInner(7394): Cursor finalized without prior close()
07-15 13:24:42.186: W/CursorWrapperInner(7394): Cursor finalized without prior close()

カーソルに関する行はこの試みにとって新しいものだと思いますが、前述したように、カーソルへのアクセスが上記の方法でしか利用できない場合、カーソルを閉じる方法を知りません。また、試みによっては、別のデータベース (アプリの別の部分からアクセスしているが、同じコンテンツ プロバイダーを使用) も漏えいしたという行が含まれている場合があります。

編集: コンテンツ プロバイダーのクエリ メソッドの関連部分を次に示します。

public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder){
        String dbName;
        Cursor cursor;
        String tables;
        SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();

        switch(uriMatcher.match(uri)){
            case CODE_OPTION_SEARCH://Called from setFixedSpinnerAdapter()
                dbName = DATABASE_PLANT_IDENTIFICATION_LOCAL;
                dbHelper = new DatabaseHelper(getContext(), dbName); 
                tables = uri.getLastPathSegment();
                db = dbHelper.getReadableDatabase();
                queryBuilder.setTables(tables);
                break;
            default:
                throw new IllegalArgumentException("Unknown URI");
        }//switch(uriMatcher.match(uri))
        cursor = queryBuilder.query(db, projection, null, null, null, null, sortOrder);
        cursor.setNotificationUri(getContext().getContentResolver(), uri);

        return cursor;
    }// method: ContentProvider.query(Uri, String[], String, String[], String)

EDIT : このようにフォーマットされたコードを、さまざまなスピナーに対して複数回使用します。

spnGrowthForm.setAdapter(setFixedSpinnerAdapter(
    DBContentProvider.TABLE_GROWTH_FORM_OPTION, 
    new String[]{DBContentProvider.KEY_GROWTH_FORM_ID,
    DBContentProvider.KEY_GROWTH_FORM_TEXT}));

やり方setFixedSpinnerAdapter(String, String[])はトップに書いた通りです。を使用したSimpleCursorAdapterのは、Spinner アイテムに関連付けられた ID# にアクセスできる唯一の方法だとわかったからです。

4

0 に答える 0