0

呼び出しが終了するとすぐにすべてのインスタンスを閉じても、次のエラーが発生します。

 close() was never explicitly called on database '/data/data/com.click4tab.fragmentvogella/databases/NewOrderDB' 

 android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here

このメソッドを定義するまで、このエラーは発生しませんでした。

public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
        case R.id.item1:
            Toast.makeText(MainActivity.this, "Button one pressed",
                    Toast.LENGTH_LONG).show();
            // write data on server
            TestAdapter mDbHelper = new TestAdapter(this);

            mDbHelper.createDatabase();
            mDbHelper.open();

            try {
                mDbHelper.writeUnwrittenNetOrder();
                mDbHelper.close();

            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
                               break;

そして、writeUnwrittenNetOrder の定義:

ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
    StringBuffer strbuf = new StringBuffer();
    params.add(new BasicNameValuePair("tag", "add_NetOrderID"));

    for (mCur.moveToFirst(); !mCur.isAfterLast(); mCur.moveToNext()) {

        String sql3 = "INSERT into NetOrderID (StoreID, Date, SalesManID, NetOrderID) VALUES ("
                + mCur.getString(0)
                + ", "
                + mCur.getString(1)
                + ", "
                + mCur.getString(2) + ", " + mCur.getString(3) + ");";
         if((mCur.isLast())){
        strbuf.append(sql3);
         }
         else {
             strbuf.append(sql3 + "#");
         }
        // String sql3 =
        // "INSERT into NetOrderID (StoreID, SalesManID, NetOrderID) VALUES (1,1,80)";
        // sqlQueries.add(sql3);
        Log.e("sql", strbuf.toString());


    }


    params.add(new BasicNameValuePair("query", strbuf.toString()));
    Log.e("param","param added");

    new SyncWithServer();
    // send params
    SyncWithServer.setParams(params);
    Log.e("param","param set");

    // return arraylist
}

このエラーを回避するには、mDbHelper をどこで閉じる必要がありますか?データベースが正常に書き込まれ、アプリケーションがクラッシュしていないときに、このエラーが Logcat に表示されます。

4

2 に答える 2

1

エラー メッセージは、データベースまたはカーソルを閉じていないことを示しています。それらもすべて閉じましたか(mCurオブジェクト)?

于 2012-08-17T07:36:30.693 に答える
0

アレックスは良い点を述べています。

また、(ただし、現時点ではそれがエラーの原因ではないと思います):mDbHelper.close()try / catchからステートメントを削除するか、finally句に入れる方がよいと思います。現在、writeUnwrittenNetOrder例外をスローすると、mDbHelper.close()が呼び出されることはありません。Alexが提案したように、カーソルを閉じるメソッドを追加すると、同等の結果が得られます。これは、開くと閉じるの間に発生する例外に関係なく発生するはずです。

于 2012-08-17T07:42:43.563 に答える