2017-04-06 56 views
0

我有一個listView由插入到我的sqlite數據庫中的數據填充。使用ContextMenu刪除特定的行sqlite

我創建了一個contextMenu,所以我可以從我的ListView中刪除項目。

當我點擊刪除,我想從我的數據庫和從我的listView刪除項目。但我不能,我不知道爲什麼。但我想通過獲取Item I的字符串來刪除它,因爲它不適用於主鍵。

這裏是我的代碼:

DatabaseHelper

public void deleteCours(String cours) 
{ 
    Open(); 
    db.execSQL("DELETE from "+TABLE_COURS+" WHERE "+COLONNE_COURS+"='"+cours+"'"); 
    db.close(); 
} 

我的ListView和文本菜單

 //ce Listener permet de détecter si on clique sur un élément de la liste 
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() 
    { 

     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 

      //récupération de l'ID 
      long itemid= lv.getItemIdAtPosition(i); 
      //conversion en int 
      int id= (int)itemid; 
      //conversion en string du cours que je selectionne 
      String a =lv.getItemAtPosition(i).toString(); 
      dbhelper.deleteCours(a); 
      //Intent pour naviguer de pag 
      /*Intent b = new Intent(AffichageCours.this,AffichageNotes.class); 
      //création d0un Bundle pour transférer des données 
      Bundle args = new Bundle(); 
      args.putString("nom_cours",a); 
      args.putInt("id",id); 
      //insertion du Bundle dans l'Intent 
      b.putExtras(args); 
      //démarrage de l'intent 
      startActivity(b);*/ 
     } 

    }); 
} 

@Override 
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { 
    super.onCreateContextMenu(menu, v, menuInfo); 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.context_menu,menu); 

} 

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); 

    switch(item.getItemId()) 
    { 
     case R.id.supprimer: 

      // I WANT TO DELETE HERE ! 
      return true; 
     default: 
      return super.onContextItemSelected(item); 
    } 
} 

}

所以,我需要得到的字符串項目,所以我可以在我的方法中使用它。我也想自動刷新我的列表視圖。

提前致謝!告訴我,如果你需要更多的代碼!

+0

請顯示完整代碼 –

+0

我編輯了我的問題 – David

+0

我按照您的要求編輯完整的代碼我的問題! – David

回答

0

嘗試這種方式

​​
0

使用此刪除特定的行。

db.delete(TABLE_COURS, COLONNE_IDCOURS+ "=" + id, null); 
+0

謝謝!我現在如何刷新適配器?因爲只有關閉並重新打開應用程序,內容纔會消失。如果要將數據存儲在Collection中(ArrayList),則應該從ArrayList中刪除該數據,或者再次從數據庫中獲取所有數據。 – David

+0

要更新適配器,我們通常使用adapterObject.notifysetdatachanged(); –

+0

我試過了,但是我不能使用上下文方法中的適配器,它不能識別適配器 – David

0

整頓查詢

public void deleteCours(int getID) { 
    Open(); 
    db.execSQL("DELETE from Table_name WHERE fieldName='"+getID+"'"); 
    db.close(); 
} 

FYI

如果你想從列表視圖

adapter.remove(arrayList.get(position)); //Remove 
adapter.notifyDataSetChanged();    //Refresh 
+0

它不起作用。任何想法 ? – David

+0

那麼,現在它刪除,但它不會刪除我的數據庫中,因爲如果我關閉並重新打開該應用程序,我刪除的項目再次出現,所以這是刪除問題.. – David

+0

@David現在需要檢查它爲什麼發生。檢查你的代碼。這個邏輯是完美的 –

0

SQLiteDatabase除去應getWritableDatabase()

試試這個:

public void deleteCours(int id) 
{ 
    Open(); 

    db.delete(TABLE_COURS, COLONNE_IDCOURS + " = ?", new String[]{String.valueOf(id)}); 
    db.close(); 
} 
+0

它不會刪除數據.. – David

0
public void deleteCours(int id) { 
    Open(); 
    String Query = "DELETE * FROM "+TABLE_COURS+" WHERE "+COLONNE_IDCOURS+"="+id; 
    Cursor cursor = db.rawQuery(Query, null); 

    // db.close(); 
    if (cursor.getCount() < 1) { 
     Toast.makeText(context,"Delete Successfull",Toast.LENGTH_SHORT).show(); 
    } else { 
     Toast.makeText(context,"Not Possible",Toast.LENGTH_SHORT).show(); 
    } 
} 

您可以檢查真的是你的數據正在被刪除或不..

或者,如果不刪除的數據,然後使用一些非主鍵字段。 。

+0

我的數據沒有被從數據庫中刪除..我怎樣才能做到這一點? – David

+0

使用非主鍵字段... – Abhay

+0

id是主鍵? – Abhay