2011-12-25 63 views
0

我知道这个问题已被问到很多,但我发现的许多答案都不尽人意。如何从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){ 
     } 
    } 

我知道有很多这里涉及的代码。如果你想要更多,请告诉我。谢谢你的帮助!

回答

2

字符串在Java中比较被.equals()equalsIgnoreCase()方法来完成,而不是与== 这可能是不是你可达声明的原因。如果你做"this"=="that"意味着你正在检查它们是否具有相同的参考。 (是可达的,因为它们都是字符串:P)

确保您的数据库对象不为空,并且检查是否有任何异常被捕获。 Plus:尝试从光标移除数据。

+0

谢谢。 if语句不是问题,代码执行得当。问题是传递sqlite数据库行的_id。我知道info.id正在返回列表视图中的行号,这并不一定= sqlite db的_id – benbeel 2011-12-25 22:05:32

+0

但是,如果有更多的if-else语句会导致所有语句可达。 – 2011-12-25 22:19:43

+0

我想你不使用数据库中的id,但是使用listview的id? – tobias 2011-12-25 23:59:47

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(); 
相关问题