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 でデータベースを閉じましたが、カーソルについてはわかりません。助けてください。
ここで同じ問題が言及されていますが、実際の解決策は得られませんでした
前もって感謝します