android - 从未在数据库上显式调用 Close

标签 android database android-sqlite

我有一个来自 sqlite 数据库的 ListView 。我在几个不同的点调用 fillData() 来更新 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);
    }

此处添加了类的完整代码

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() 没有在数据库上显式调用,类似这样。该错误并没有阻止我在任何地方的工作,但问题看起来很奇怪。我想我必须关闭光标,但不确定。我已经关闭了销毁数据库,但不确定游标。请帮忙。

提到同样的问题here但没有得到实际的解决方案

提前致谢

最佳答案

每次使用后关闭您的光标,那么您的问题就会得到解决

itemsCursor.close()

由于您没有关闭它,因此当您关闭数据库时,不会释放游标的资源,您会收到该错误。

将光标设置为全局变量,然后在 onDestroy

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

当您现在添加 close 语句作为 filldata 方法的最后一个语句时,listviewAdapter > 没有获取任何数据,因为 cursor 已经释放,因此您在 listview 中没有获取任何数据。

关于android - 从未在数据库上显式调用 Close,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14598459/

相关文章:

Android数据绑定(bind)调试

php - 产品 ID 未存储在数据库中

PHP 变量未显示在页面上

java - 导入 Java OrientDB 包

android - SQLiteOpenHelper:未在物理设备上调用 onCreate() 方法

android - 使用 SQLite 将数据从一个 Activity 传输到另一 Activity : Android Studio

android - 如何在 gradle 中读取 `minSdkVersion`?

Android - 图书馆项目

android - 什么时候调用 SQLiteOpenHelper 方法?

android - 图片从 Android 应用程序分享到 Facebook