问题描述
我有由一个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
在此先感谢
推荐答案
Colse你的光标
然后使用你的问题后,每次都会解决了博
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 code>方法的最后声明中,
适配器
列表视图
没有得到任何数据,光标
已经发布这个原因,你没有在列表视图
获取任何数据。
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
.
这篇关于关闭从来没有明确地呼吁数据库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!