【问题标题】:Delete specific row with ContextMenu sqlite使用 ContextMenu sqlite 删除特定行
【发布时间】:2017-04-06 11:11:46
【问题描述】:

我有一个 listView,它由插入到我的 sqlite 数据库中的数据填充。

我创建了一个 contextMenu,这样我就可以从我的 ListView 中删除项目。

当我单击删除时,我想从我的数据库和我的 listView 中删除该项目。但我不能,我不知道为什么。但是我想通过获取Item I的字符串来删除,因为它不适用于主键。

这是我的代码:

数据库助手

 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);
    }
}

}

所以,我需要获取项目的字符串,以便在我的方法中使用它。我也想自动刷新我的列表视图。

提前致谢!如果您需要更多代码,请告诉我!

【问题讨论】:

  • 请显示完整代码
  • 我编辑了我的问题
  • 我按照您的要求使用完整代码编辑了我的问题!

标签: android sqlite listview contextmenu


【解决方案1】:

纠正查询 .

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

仅供参考

如果你想从 Listview 中删除

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

【讨论】:

  • 好吧,现在它删除了,但我的数据库中也没有删除,因为如果我关闭并重新打开应用程序,我删除的项目会再次出现,所以这是删除的问题..
  • @David 现在需要检查它发生的原因。检查你的代码。这个逻辑是完美的
  • 是否需要更改用于从表中获取数据的方法的代码?
  • @David 根据您的代码,当应用启动时,for (int i = 0; 出现。
  • @David 请提供完整代码。主要问题已解决。只需要纠正逻辑
【解决方案2】:

试试这个方法

public void deleteCours(int id)
{
    Open();
    db.execSQL("DELETE FROM "+TABLE_COURS+" WHERE "+COLONNE_IDCOURS+"='"+id+"'");
    db.close();
}

【讨论】:

    【解决方案3】:

    SQLiteDatabase 应该是 getWritableDatabase()

    试试这个:

    public void deleteCours(int id)
    {
        Open();
    
        db.delete(TABLE_COURS, COLONNE_IDCOURS + " = ?", new String[]{String.valueOf(id)});
        db.close();
    }
    

    【讨论】:

      【解决方案4】:

      使用它来删除特定的行。

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

      【讨论】:

      • 谢谢!我现在如何刷新适配器?因为只有当我关闭并重新打开应用程序时,内容才会消失..
      • 如果您将数据存储在 Collection(ArrayList) 中,那么您应该也从 ArrayList 中删除该数据,或者再次从数据库中获取所有数据。要更新适配器,我们通常使用 adapterObject.notifysetdatachanged();
      • 我试过了,但我不能在上下文方法中使用适配器,它无法识别适配器
      【解决方案5】:
      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();
          }
      }
      

      您可以检查您的数据是否真的被删除..

      或者如果不删除数据然后使用一些非主键字段..

      【讨论】:

      • 我的数据没有从数据库中删除。我该怎么做?
      • id 是主键吗?
      • id 是我从列表视图中获得的 id
      • “使用非主键字段”是什么意思?
      • 我认为 id 是主键..您可以尝试使用其他非主键列名称
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多