如何从Listview和数据库中删除项目?
问题描述:
我知道这个问题已被问到很多,但我发现的许多答案都不尽人意。如何从Listview和数据库中删除项目?
我有一个通过数据库显示列表的Baseadapter。信息通过游标从数据库传递到列表,游标将光标添加到数组列表,然后填充列表视图。我想通过一个contextmenu删除一个listitem,并从listview和数据库中删除它。目前,我使用adaptercontextmenuinfo对象来获取传递给数据库类中的delete方法的位置和/或id,但info.id与数据库_id不相对应。目前我能够成功地从listadapter中删除行条目,但不能从数据库中删除。任何帮助将非常感激。 (注:我的数据库中有3列,其中第一感_id的) 文本菜单的java:
@Override
public boolean onContextItemSelected(MenuItem item) {
if(item.getTitle() == "Delete"){ //if "delete" is selected
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
dba.deleteRow(info.id);
DATA.remove(info.position);
adapter.notifyDataSetChanged();
数据库中删除行法:
public void deleteRow(long rowId){
db = dbhelper.getWritableDatabase();
try{
db.delete(Constants.TABLE_NAME, Constants.KEY_ID + "="+rowId,null);
}catch(Exception e){
}
}
我知道有很多这里涉及的代码。如果你想要更多,请告诉我。谢谢你的帮助!
答
字符串在Java中比较被.equals()
或equalsIgnoreCase()
方法来完成,而不是与==
这可能是不是你可达声明的原因。如果你做"this"=="that"
意味着你正在检查它们是否具有相同的参考。 (是可达的,因为它们都是字符串:P)
确保您的数据库对象不为空,并且检查是否有任何异常被捕获。 Plus:尝试从光标移除数据。
答
我想出了答案。这里是:
AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
Cursor c = dba.getsavedcontacts();
c.moveToPosition(info.position);
String id = c.getString(c.getColumnIndex(Constants.KEY_ID));
dba.open();
dba.deleteRow(Long.parseLong(id));//remove entry from database according to rowID
DATA.remove(info.position); //remove entry from arrayadapter, will remove entry from listview
adapter.notifyDataSetChanged();
c.close();
谢谢。 if语句不是问题,代码执行得当。问题是传递sqlite数据库行的_id。我知道info.id正在返回列表视图中的行号,这并不一定= sqlite db的_id – benbeel 2011-12-25 22:05:32
但是,如果有更多的if-else语句会导致所有语句可达。 – 2011-12-25 22:19:43
我想你不使用数据库中的id,但是使用listview的id? – tobias 2011-12-25 23:59:47