【问题标题】:Delete item from both, database and listview on clicking Delete Button单击删除按钮从数据库和列表视图中删除项目
【发布时间】:2015-08-02 11:51:50
【问题描述】:

我需要从 ListView 中永久删除一个项目,然后再从数据库中删除。我有一个 DatabaseHandler.java 类,它的删除功能为:

// Deleting single contact, in DatabaseHandler.java class
public void deleteContact(Contact contact) {
    SQLiteDatabase db = this.getWritableDatabase();
    db.delete(TABLE_CONTACTS, KEY_ID + " = ?",
            new String[] { String.valueOf(contact.getID()) });
    db.close();
}

然后我有一个FriendList.java 类,当用户的朋友在ListView 中显示为一个项目。当我长按某个项目时,我会在对话框中获得“删除”和“取消”选项。现在,当我单击删除时,该项目会从 ListView 中删除,但不会从数据库中删除。我怎样才能从数据库中删除它? 获取“删除”和“取消”选项的代码

listview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {


      @Override
      public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
              int position, long id) {
          // TODO Auto-generated method stub
                  Intent i = new Intent(FriendList.this, Delete_Confirm.class).addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
  //I am sending position of listitem in putExtra below//     
          i.putExtra("position", position);
          startActivityForResult(i,CONFIRM);
          item2 = (String) arg0.getItemAtPosition(position);


          //Toast.makeText(FriendList.this, "Clicked"+item2, Toast.LENGTH_SHORT).show();
          int l = item2.length();
          c=0;
          for(int j=0; j<=l; j++){
              if(item2.charAt(j) != '9' || item2.charAt(j+1) != '1'){
                  c++;                   
              }
              else {
                  //Do nothing
                  break;
              }
              num = item2.substring(c, l);  

          }


          Toast.makeText(FriendList.this, "Clicked: "+num, Toast.LENGTH_SHORT).show();
          return true;


      }
      }); 

onActivityResult对应的代码如下:

@Override
public void onActivityResult(int reqCode, int resultCode, Intent data) {
  super.onActivityResult(reqCode, resultCode, data);

  switch (reqCode) {
  case (CONFIRM) :
  if(resultCode==RESULT_OK){
      int posi = data.getIntExtra("position",0);
          Log.d("msg","position is " + posi);

          Log.d("msg","Do we reach here?");
          final StableArrayAdapter adapter = new StableArrayAdapter(this,
                    android.R.layout.simple_list_item_1, list);
                    //db.deleteContact(posi);
                    list.remove(posi);

                  listview.setAdapter(adapter);
          adapter.notifyDataSetChanged();


  }

    break;

}}

请建议我如何从数据库中删除它。任何帮助将不胜感激。

编辑: 在取消注释 db.deleteContact(posi) 时,我收到以下错误: DatabaseHandler类型中的deleteContact(Contact)方法不适用于参数(int)

请注意,deleteContact 函数有 Contact 类型的联系人变量。

【问题讨论】:

  • 为什么 db.deleteContact(posi) 被注释掉了?
  • @SnapDragon:因为它没有从数据库中删除联系人,我不知道为什么:(。它导致应用程序崩溃,所以,我评论它继续调试。
  • 请在应用崩溃时发布日志
  • @user1903022 只需取消注释该行并发布堆栈跟踪。
  • @user1903022,不要在 UI 线程中访问数据库。这可能会导致崩溃。

标签: java android listview


【解决方案1】:

这是一个编译错误。 您需要将 Contact 对象传递给该方法,而不是整数。

【讨论】:

  • 'Id' 将是一个整数类型,那么,您建议在 deleteContact(contact) 函数中进行什么样的更改,以便 posi 的整数值可以工作?
  • @user1903022,从适配器获取行的id而不是位置,然后传递它而不是contact.getID())
  • 你能举个例子吗?我是 Android 新手,如果您能举个例子,我将不胜感激。
  • 您需要创建一个联系人对象并将其作为参数传入。但是,您不能只将 listview 位置作为要从数据库中删除的 ID 传递,因为不一定匹配正确的数据库 ID。您是否考虑过使用光标适配器?
【解决方案2】:

当你删除.. 尝试从 database 中删除 first 然后从 ListView..
示例:

 db.deleteContact(list.get(posi));  // this will get string  
 list.remove(posi);  

DatabaseHandler 类.......

public void deleteContact(String name){
    Log.d("Name:",""+ name);
    db.delete(TABLE_CONTACTS, KEY_NAME + " = ?", new String[] { name });

}                                                                  

【讨论】:

  • 它给出了错误,如问题的编辑部分所示。问题是数据类型不同。
  • 我编辑了我的答案尝试...一次...........@user1903022 尝试将联系人更改为字符串
  • 它正在从ListView中删除该项目,但是,当我关闭应用程序并再次打开应用程序时删除后,删除的联系人再次可见。
  • 您是否尝试更改我编辑的 anwser 的代码......您的 deleteContact(to string) 并且不要评论 db.deleteContact(list.get(posi));
  • 是的,我完全按照你的建议做了。最终的 StableArrayAdapter 适配器 = new StableArrayAdapter(this, android.R.layout.simple_list_item_1, list); db.deleteContact(list.get(posi)); Log.i("数据库检查", "数据库检查"+ list.get(posi) ); list.remove(posi); listview.setAdapter(适配器); adapter.notifyDataSetChanged();
【解决方案3】:

您可以先从数据库中删除,然后再从 ListView 中删除。并建议 Iterator 删除列表元素。

【讨论】:

    【解决方案4】:

    我认为问题是位置不是数据库中对应的id。一个可能的解决方案是添加一个标签,其中包含您在此列表项中拥有的联系人的数据库 ID。当你删除它时,你会得到带有 id 的标签并从数据库中删除该项目。

    编辑(添加说明):

    我会在您的 listviewadapter 中添加如下内容:

    yourcontactview.setTag(contact.getId());
    

    您可以在其中向视图添加一个带有相应联系人的数据库 ID 的标签。

    然后你在哪里删除联系人我会得到你想要删除的联系人,如下所示:

    Contact deletecontact = db.getContact(view.getTag());
    db.deleteContact(deletecontact);
    

    当然你可以改变你的 deleteContact(Contact contact) 为您提供 id 而不是 contactobject 的方法。

    这应该会奏效。

    【讨论】:

    • 能否举个例子。我是 Android 新手,一些代码示例会很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    相关资源
    最近更新 更多