关闭从来没有明确地呼吁数据库 [英] Close was never explicitly called on Database

查看:311
本文介绍了关闭从来没有明确地呼吁数据库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有由一个SQLite数据库源列表视图。我叫fillData()在几个不同点更新列表视图。

I have a listview that is sourced by an sqlite db. I call fillData() at several different points to update the listview.

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);
    }

类的全code在这里添加

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中即关闭一些错误()未对数据库是这样的明确要求。错误犯规阻止我在任何地方工作,但问题看起来奇怪。我想我必须关闭游标,但不知道这一点。我已经关闭了销毁,但不知道光标数据库。请帮助。

All the things are going good here, but I found some errors in Logcat ie close() were not called explicitly on database something like this. The error doesnt stop my working anywhere but problem looks wierd. I think I have to close cursor but not sure about that. I have closed database on Destroy but not sure about cursor. Please help.

同样的问题被提及 href=\"http://stackoverflow.com/questions/5707713/close-was-never-explicitly-called\">但没有得到实际的解决方案。

Same problem is mentioned here but didnt get the actual solution

在此先感谢

推荐答案

Col​​se你的光标然后使用你的问题后,每次都会解决了博

Colse your cursor every time after using then your problem will bo solved

itemsCursor.close()

当你不关闭此,光标的资源没有被释放因为这个原因,当你关闭你的数据库你得到这个错误。

As you are not closing this, resources of the cursor is not released for that reason when you close your db you are getting that error.

请您为光标全局变量,然后在你的的onDestroy

Make Your cursor as global variable then on your onDestroy

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

和你现在加入关闭语句 filldata 方法的最后声明中,适配器 列表视图没有得到任何数据,光标已经发布这个原因,你没有在列表视图获取任何数据。

And as you are now adding close statement as a last statement of filldata method, the Adapter of listview doesn't get any data as cursor is already released for that reason you are not getting any data in listview.

这篇关于关闭从来没有明确地呼吁数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆