Android 如何从Listview和数据库中删除项目?
我知道这个问题被问了很多,但我发现很多答案都不令人满意 我有一个Baseadapter,它通过数据库显示列表。信息通过光标从数据库传递到列表,光标将光标添加到arraylist,arraylist随后填充listview。我想通过contextmenu删除listitem,并将其从listview和数据库中删除。目前,我正在使用adaptercontextmenuinfo对象获取我传递给database类中的delete方法的位置和/或id,但info.id与database _id不对应。目前我能够成功地从listadapter中删除行条目,但无法从数据库中删除。任何帮助都将不胜感激。 (注意:我的数据库有3列,第一列是_id) 上下文菜单java:Android 如何从Listview和数据库中删除项目?,android,sqlite,listview,Android,Sqlite,Listview,我知道这个问题被问了很多,但我发现很多答案都不令人满意 我有一个Baseadapter,它通过数据库显示列表。信息通过光标从数据库传递到列表,光标将光标添加到arraylist,arraylist随后填充listview。我想通过contextmenu删除listitem,并将其从listview和数据库中删除。目前,我正在使用adaptercontextmenuinfo对象获取我传递给database类中的delete方法的位置和/或id,但info.id与database _id不对应。目前
@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()
方法完成的,而不是通过=
这可能是无法访问您的语句的原因。如果您这样做,“这”==“那”
表示您正在检查它们是否具有相同的引用。(是的,它是可到达的,因为它们都是字符串:P)
确保数据库对象不为null,并检查是否捕获了任何异常。另外:尝试从光标中删除数据 我找到了答案。这是:
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正在返回listview中的行号,这不一定是sqlite数据库的id,但如果您有更多if-else语句,则会使您可以访问所有语句。我认为您使用的不是数据库中的id,而是listview的id?@nikola:正在访问代码,我已经通过调试日志确认了这一点。这就是我的意思和所说的:)是的,它是可以到达的,我对此没有异议。:)