2013-09-30 88 views
1

我試過了從列表視圖中刪除記錄的多項方法,只需點擊項目,但沒有任何反應,沒有錯誤,沒有刪除任何東西,只是吐司顯示了.. 。 下面是代碼:Android:無法從ListView和SQLite中刪除記錄

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    overridePendingTransition(R.layout.push_left_in, R.layout.push_left_out); 
    setContentView(R.layout.moje_ure); 
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

    datasource = new VnosiDataSource(this); 
    datasource.open(); 


    final List<VnosiDB> values = datasource.getAllDela(); 
    final ArrayAdapter<VnosiDB> adapter = new ArrayAdapter<VnosiDB>(this, 
     android.R.layout.simple_list_item_1, values); 
    setListAdapter(adapter); 
    ListView ureList = getListView(); 
    adapter.notifyDataSetChanged(); 
    ureList.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> arg0, View view, int pos, 
      long id) { 
      // TODO Auto-generated method stub 

      //some code here... 

      String posit = values.get(pos).toString(); 
      Toast.makeText(Ure.this, posit, Toast.LENGTH_SHORT).show(); 
     } 
    }); 
    ureList.setOnItemLongClickListener(new OnItemLongClickListener() { 

    @Override 
    public boolean onItemLongClick(AdapterView<?> arg0, View view, 
      int pos, long id) { 
     // TODO Auto-generated method stub 

     datasource.deleteVnos((int)values.get(pos).getId()); 
     Toast.makeText(Ure.this, "Vnos " + values.get(pos).toString() + " izbrisan!", Toast.LENGTH_SHORT).show(); 
     adapter.notifyDataSetChanged(); 
     return true; 
    } 
}); 

以及數據庫的刪除方法:

public void deleteVnos(int _id){ 

    database.delete(DatabaseManidzer.TABLE_VNOSI, DatabaseManidzer.COLUMN_ID + " = " + _id, null); 
} 

public void open() throws SQLException { 
    database = dbHelper.getWritableDatabase(); 
} 

UPDATE:

:用於填充類VnosiDataSource.java列表視圖方法

我錯過了什麼?

回答

0

您需要在刪除項目後再次查詢數據庫。一旦你得到結果,重新設置適配器的結果。

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    .... 
updateListView(); 
ureList.setOnItemClickListener(new OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> arg0, View view, int pos, 
     long id) { 
     // TODO Auto-generated method stub 

     //some code here... 

     String posit = values.get(pos).toString(); 
     Toast.makeText(Ure.this, posit, Toast.LENGTH_SHORT).show(); 
    } 
}); 
ureList.setOnItemLongClickListener(new OnItemLongClickListener() { 

    @Override 
    public boolean onItemLongClick(AdapterView<?> arg0, View view, 
     int pos, long id) { 
    VnosiDB item = (VnosiDB) getListAdapter().getItem(pos); 
    int itemId = item.getId(); 
    datasource.deleteVnos(itemId); 
    Toast.makeText(Ure.this, "Vnos " + item.toString() + " izbrisan!", Toast.LENGTH_SHORT).show(); 
    updateListView(); 
    return true; 
    } 
}); 

public void updateListView() { 
    final List<VnosiDB> values = datasource.getAllDela(); 
    final ArrayAdapter<VnosiDB> adapter = new ArrayAdapter<VnosiDB>(this, 
     android.R.layout.simple_list_item_1, values); 
    setListAdapter(adapter); 
} 

public void deleteVnos(long itemId){ 
    database.delete(DatabaseManidzer.TABLE_VNOSI, "_id = ?", new String[]{Long.toString(itemId)}); 
} 

UPDATE
您沒有選擇_id當您爲您的項目查詢數據庫。我不確定你在cursorToDela(cursor)中做了什麼,但是你沒有該遊標中的_id來填充由curdela.getId()返回的內容。

public List<VnosiDB> getAllDela() { 

    List<VnosiDB> dela = new ArrayList<VnosiDB>(); 

    Cursor cursor = database.rawQuery(
     "SELECT _id, delo from vnosi ORDER BY vnos DESC", null); 

    while (cursor.moveToFirst()){ 
    //cursorToDela needs to grab the _id from the cursor and set it on the created VnosiDB. 
    VnosiDB curdela = cursorToDela(cursor); 
    dela.add(curdela); 
    } 
    // Make sure to close the cursor 
    cursor.close(); 
    return dela; 
} 
+0

謝謝,但它仍然無法工作...和以前一樣:我得到祝酒,但沒有任何反應的列表視圖或數據庫... – belosand

+0

'DatabaseManidzer.COLUMN_ID =「_id」'? – DroidT

+0

我更新了我的答案,其中應該解決您的問題的deleteVnos方法。唯一可能錯誤的是表名,或者當您試圖刪除它時,數據庫中沒有該項的內容。如果此解決方案不起作用,則作爲測試,請嘗試在刪除該項目之前查詢該項目的數據庫,以確保其位於該位置,並且可以通過該ID訪問該項目。 – DroidT

0

db.delete需要3個參數 - 這從參考

公衆詮釋刪除(字符串表,字符串whereClause,字符串[] whereArgs)

所以,你的代碼應該是這個樣子:

db.delete(TableName, "Id=?" , 
     new String[] { Id.toString() }); 
+0

它仍然無法正常工作......像以前一樣:我得到的烤麪包,但沒有任何反應,以列表視圖或數據庫... – belosand

+0

您要刪除的行形成數據庫,但不從列表(值)該適配器綁定到。刪除後,您必須從值中刪除項目或重建值。 – Glenn

+0

是的,我已經用DroidT做了這個答案。我還有另一個活動,顯示從數據庫中的一些內容,所以我可以驗證內容也沒有從數據庫中刪除...任何想法? – belosand