gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 09:01:44 25 4
gpt4 key购买 nike

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

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

提前致谢

最佳答案

每次使用后关闭你的cursor然后你的问题就解决了

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com