2

私はそれについてここに多くの投稿を見ましたが、アプリを停止させることができず、 DB を閉じていないというエラーが送信されました。私のDBは、アクティビティによってアクセスされることもあれば、バックグラウンドクラス(サービス)からアクセスされることもあります。

アクティビティの使用DBに追加しました

protected void onDestroy() {
    Log.d("OnDestroy", "called");
    sqlAdapter helper = new sqlAdapter(StartScreen.this);
    helper.close();
    super.onDestroy();
}

ここで多くの投稿で提案されているように、問題は解決しません。

理解するのに役立つアイデアや説明はありますか?アプリがクラッシュしたり、データベースを閉じていないという多くのエラーが発生したりしませんでした

ありがとう!

4

2 に答える 2

0

あなたの例では、新しいオブジェクトを作成していて、onDestroy古いオブジェクトを閉じていないように見えます。だからあなたがするたびに

sqlAdapter helper = new sqlAdapter(StartScreen.this);

新しいオブジェクトを作成していますが、閉じられていない参照が大量にあり、これが警告の原因です。

代わりに、アプリケーションで 1 つのオブジェクトを維持し、onDestroy.

public void onDestroy() {
    super.onDestroy();
    // close database
    final MySqlHelper helper = MySqlHelper.getInstance();
    helper.getDatabase().close();
}

onDestroyそれ以外の場合は、今しようとしているようになるまで開いたままになります。もちろん、これは適切な場合に使用する必要があり、アプリケーションで積極的に使用しています。データベースをめったに使用しない場合は、使用するたびにデータベースを閉じるだけで問題ありません。

アイデアは、適度な量のデータベースのオープン/クローズ呼び出しを減らし、そのユースケースでより効率的になるということです。

これは、非常に単純化されたシングルトンの例です。

public class MySqlHelper extends SQLiteOpenHelper {
    static MySqlHelper mInstance = null;
    static SQLiteDatabase mDatabase = null;

    public static MySqlHelper getInstance() {
        if (mInstance == null) {
            // call private constructor
            mInstance = new MySqlHelper();
        }
        mDatabase = mInstance.getWritableDatabase();
        while(mDatabase.isDbLockedByCurrentThread() || mDatabase.isDbLockedByOtherThreads()) {
            // loop until available
        }
        return mInstance;
    }

    private MySqlHelper() {
        // mContext here is just a placeholder for your ApplicationContext
        // that you should have available to this class.
        super(mContext, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // all other filled out methods like onCreate, onUpgrade, etc
}

これを使用してデータソースを実装できます

public class MyDataSource {
    // Database fields
    private final SQLiteDatabase mDatabase;
    private final MySqlHelper mHelper;

    public MyDataSource() {
        mHelper = MySqlHelper.getInstance();
        mDatabase = mHelper.getDatabase();
    }

    // add your custom methods 

    private int update(ContentValues values, String whereClause) {
        int rowsUpdated = 0;
        synchronized (mDatabase) {
            rowsUpdated = mDatabase.update(MySqlHelper.TABLE_NAME, values, whereClause, null);
        }
        return rowsUpdated;
    }

    public int updateById(ContentValues values, int id) {
        final String whereClause = MySqlHelper.COLUMN_ID + "=" + id;
        return this.update(values, whereClause);
    }
}
于 2013-03-29T14:36:09.763 に答える
0

終了するたびに閉じる必要があります。cursorアクセスするために を作成した場合は、データを取得して保存するか、データの処理を終了してから、 を閉じる必要がありcursorます。その後、次に必要になったときにもう一度開きます。この答えはあなたを助けるはずです

于 2013-03-29T14:09:48.793 に答える