2

sqlite db をソースとするリストビューがあります。リストビューを更新するために、いくつかの異なるポイントで fillData() を呼び出します。

private void fillData() {
    readDatabase.open();
    Cursor itemsCursor = readDatabase.fetchAllItems();


    startManagingCursor(itemsCursor);

    String[] from = new String[] { DatabaseHandler.KEY_ITEM,
            DatabaseHandler.KEY_UNITCOST, DatabaseHandler.KEY_QUANTITY,
            DatabaseHandler.KEY_TOTAL };

    int[] to = new int[] { R.id.itemtext, R.id.costtext, R.id.quantitytext,
            R.id.totaltext };

    SimpleCursorAdapter items = new SimpleCursorAdapter(this,
            R.layout.rowincart, itemsCursor, from, to);

    setListAdapter(items);
    }

クラスのコード全体がここに追加されます

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.cartactivity);
    readDatabase = new DatabaseHandler(this);
//  readDatabase.open();
    loadwidget();
    fillData();
    ListView lv = getListView();
    this.registerForContextMenu(lv);

}

private void loadwidget() {
    Bundle extras = getIntent().getExtras();
    cost = extras.getInt("Cost");
    quantity = extras.getInt("quantity");
    product = extras.getString("product");
    Log.i("Hello Testing", cost + " and " + quantity + "   " + product);

}

@SuppressWarnings("deprecation")
private void fillData() {
    readDatabase.open();
    itemsCursor = readDatabase.fetchAllItems();


    startManagingCursor(itemsCursor);

    String[] from = new String[] { DatabaseHandler.KEY_ITEM,
            DatabaseHandler.KEY_UNITCOST, DatabaseHandler.KEY_QUANTITY,
            DatabaseHandler.KEY_TOTAL };

    int[] to = new int[] { R.id.itemtext, R.id.costtext, R.id.quantitytext,
            R.id.totaltext };

    SimpleCursorAdapter items = new SimpleCursorAdapter(this,
            R.layout.rowincart, itemsCursor, from, to);

    setListAdapter(items);

    }


@Override
protected void onDestroy() {
    super.onDestroy();
    itemsCursor.close();
    readDatabase.close();
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v,
        ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);

    menu.setHeaderTitle("SMARTAWAY");

    menu.add(0, DELETE_ID, 1, "Delete Item");

    menu.add(0, UPDATE_ID, 1, "Change Quantity");
}

public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case DELETE_ID:
        AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
                .getMenuInfo();
        readDatabase.deleteItem(info.id);
        fillData();
        return true;
    case UPDATE_ID:

        final AdapterContextMenuInfo info1 = (AdapterContextMenuInfo) item
                .getMenuInfo();
        final Dialog dialog = new Dialog(Cartactivity.this);
        dialog.setContentView(R.layout.dialog);
        final EditText edit0 = (EditText) dialog
                .findViewById(R.id.quantity);
        edit0.setText(String.valueOf(Quantity));
        Button ok = (Button) dialog.findViewById(R.id.ok);
        dialog.setTitle("          Add More Items          ");
        dialog.setCancelable(true);
        Button inc = (Button) dialog.findViewById(R.id.inc);
        inc.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                int c = Integer.parseInt(Quantity);
                c = c + 1;
                Quantity = String.valueOf(c);
                edit0.setText(Quantity);

            }
        });
        Button dec = (Button) dialog.findViewById(R.id.dec);
        dec.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                int c = Integer.parseInt(Quantity);
                c = c - 1;
                Quantity = String.valueOf(c);
                edit0.setText(Quantity);
            }
        });
        ok.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {

                row1 = info1.id; 
                flag = 1;
                int b = Integer.parseInt(Quantity);
                int total = cost * b;
                _total = String.valueOf(total);
                _cost = String.valueOf(cost);
                _quantity = String.valueOf(b);
                _item = product;

                Log.i(row1+" id"+_total +" total"+ _cost +" cost"+ _quantity+" quant", "Hello updated database");

                readDatabase.updateItem(row1, _item, _cost, _quantity, _total);

                fillData();

                dialog.dismiss();

            }
        });
        Button cancel = (Button) dialog.findViewById(R.id.cancel);
        cancel.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
            dialog.dismiss();   
            }
        });
        dialog.show();

        return true;
    }

    return super.onContextItemSelected(item);
}

@Override
protected void onListItemClick(ListView l, View v, int position, long thisID) {
    super.onListItemClick(l, v, position, thisID);

    l.showContextMenuForChild(v);

    Cursor cursor = (Cursor) getListAdapter().getItem(position);
    Quantity = cursor.getString(cursor
            .getColumnIndex(DatabaseHandler.KEY_QUANTITY));
    /*Total = cursor.getString(cursor
            .getColumnIndex(DatabaseHandler.KEY_TOTAL));*/

}

ここではすべて順調に進んでいますが、Logcat でいくつかのエラーが見つかりました。つまり、このようなデータベースで close() が明示的に呼び出されませんでした。エラーはどこでも作業を停止しませんが、問題は奇妙に見えます。カーソルを閉じる必要があると思いますが、それについてはわかりません。Destroy でデータベースを閉じましたが、カーソルについてはわかりません。助けてください。

ここで同じ問題が言及されていますが、実際の解決策は得られませんでした

前もって感謝します

4

2 に答える 2

2

cursor使用後は毎回コルセを使用すると、問題が解決されます

itemsCursor.close()

これを閉じていないため、エラーが発生しているデータベースを閉じると、その理由でカーソルのリソースが解放されません。

カーソルをグローバル変数にしてから、onDestroy

@Override
protected void onDestroy() {
    super.onDestroy();
    itemsCursor.close();
    db.close();
}

そして、メソッドcloseの最後のステートメントとしてステートメントを追加しているため、すでに解放されているため、のデータを取得していないため、 ofはデータを取得しません。filldataAdapterlistviewcursorlistview

于 2013-01-30T07:13:14.597 に答える
1

cursorオブジェクトとメソッドdatabase内のオブジェクトを閉じる必要があります。onDestroy()

if (itemsCursor!=null){
    itemsCursor.close();
}
if (readDatabase!=null){
    readDatabase.close();
}

編集- fillData () 関数の最後でカーソルを閉じてみましたか?

@SuppressWarnings("deprecation")
private void fillData() {
    readDatabase.open();
    itemsCursor = readDatabase.fetchAllItems();


    startManagingCursor(itemsCursor);

    String[] from = new String[] { DatabaseHandler.KEY_ITEM,
            DatabaseHandler.KEY_UNITCOST, DatabaseHandler.KEY_QUANTITY,
            DatabaseHandler.KEY_TOTAL };

    int[] to = new int[] { R.id.itemtext, R.id.costtext, R.id.quantitytext,
            R.id.totaltext };

    SimpleCursorAdapter items = new SimpleCursorAdapter(this,
            R.layout.rowincart, itemsCursor, from, to);

    setListAdapter(items);
    if (itemsCursor!=null){
    itemsCursor.close();
     }
    if (readDatabase!=null){
        readDatabase.close();
      }
    }
于 2013-01-30T07:15:14.000 に答える