2011-12-25 99 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(); 
相關問題