我知道这个问题已被提出很多问题,但我发现的许多答案都不尽如人意。
我有一个Baseadapter,它通过数据库显示一个列表。信息通过游标从数据库传递到列表,游标将光标添加到arraylist,然后arraylist填充listview。我想通过contextmenu删除listitem,并从listview和数据库中删除它。目前,我使用adaptercontextmenuinfo对象来获取我传递给数据库类中的delete方法的位置和/或id,但是info.id与数据库_id不对应。目前,我能够从listadapter成功删除行条目,但不能从数据库中删除。任何帮助将非常感激。 (注意:我的数据库有3列,第一列是_id) ContextMenu 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){
}
}
我知道这里涉及很多代码。如果您想要更多,请告诉我。谢谢你的帮助!
答案 0 :(得分:2)
比较Java中的字符串是通过.equals()
或equalsIgnoreCase()
方法完成的,而不是==
这可能是导致您的陈述无法访问的原因。如果你这样做"this"=="that"
意味着你正在检查它们是否具有相同的参考。 (是的,它可以到达,因为它们都是字符串:P)
确保您的数据库对象不为null,并检查是否捕获到任何异常。另外:尝试从光标中删除数据。
答案 1 :(得分:0)
我想出了答案。这是:
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();