0

そのため、しばらく取り組んできたアプリのすべてを仕上げています。コンソールに表示される唯一のエラーは、DatabaseObjectNotClosedException です。アプリが閉じたりクラッシュしたりすることはありませんが、閉じられていないカーソルが大きな問題になる可能性があることを読んだので、これについて心配しています.

エラーメッセージは次のとおりです。

05-28 20:40:01.598: E/Database(655): android.database.sqlite.DatabaseObjectNotClosedException: アプリケーションは、ここで開かれたカーソルまたはデータベース オブジェクトを閉じませんでした

参照しているコードは次のとおりです。

    datasource = new ProgressDataSource(this);
    datasource.open();

ProgressDataSource のコードは次のとおりです。

package com.gauv.myapp;

import java.util.Arrays;
import java.util.Collections;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import com.jjoe64.graphview.GraphView.GraphViewData;

public class ProgressDataSource {

    private SQLiteDatabase database;
    private MySQLiteHelper dbHelper;

    public ProgressDataSource(Context context) {
        dbHelper = new MySQLiteHelper(context);
    }

    public void open() throws SQLException {
        database = dbHelper.getWritableDatabase();
    }

    public void close() {
        dbHelper.close();
    }

    public GraphViewData[] fetchProgress(long dayExerciseDataID) {      
        Cursor cursor = database.rawQuery("select " + MySQLiteHelper.COLUMN_1RM + " " +
                "from " + MySQLiteHelper.TABLE_LOGS + " " +
                "where " + MySQLiteHelper.COLUMN_ID_DAY_EXERCISE + "='" + dayExerciseDataID + "' " +
                "order by " + MySQLiteHelper.COLUMN_DATE + " desc limit 30", null);

        GraphViewData[] data = new GraphViewData[cursor.getCount()];
        Long[] onerms = new Long[cursor.getCount()];

        int i = 0;

        cursor.moveToFirst();
        while (cursor.isAfterLast() == false) 
        {
            onerms[i] = cursor.getLong(0);
            i++;
            cursor.moveToNext();
        }

        Collections.reverse(Arrays.asList(onerms));

        int y = 1;

        for (int x = 0; x < onerms.length; x++) {
            data[x] = new GraphViewData(y, onerms[x]);
            y++;
        }

        return data;
    }

    public String fetchProgressCount(long dayExerciseDataID) {
        Cursor cursor = database.rawQuery("select " + MySQLiteHelper.COLUMN_1RM + " " +
                "from " + MySQLiteHelper.TABLE_LOGS + " " +
                "where " + MySQLiteHelper.COLUMN_ID_DAY_EXERCISE + "='" + dayExerciseDataID + "' " +
                "order by " + MySQLiteHelper.COLUMN_DATE + " desc limit 12", null);

        return String.valueOf(cursor.getCount());
    }
} 

cursor.close()fetchProgress 関数に追加するだけでよいのでしょうか?

4

2 に答える 2

2

完了したらデータベースを閉じる必要があるため、呼び出すだけdatasource.close()で済みます。はい、もう使用していないカーソルを閉じて、メモリから解放する必要があります。

于 2013-05-29T18:54:32.847 に答える
0

このエラーは、データベース接続を開いたままにしたことを示しています。あなたのコード スニペットはこれを確認します。カーソルから何らかのドメイン オブジェクトに情報を取得し、カーソルと接続の両方をクリーンアップすることをお勧めします。

コード例:

// open db connection
DataBaseHelper db = new DataBaseHelper(this);
db.open();

// retrieve your items using a cursor object
Cursor cursor = db.rawQuery("SELECT * FROM SOME_DB", null); 

// iterate all your items here and move to some collection or domain model 
// ...

// and clean up your mess
cursor.close();
db.close(); 
于 2013-05-29T20:30:10.727 に答える