Java 单击“删除”按钮,从数据库和列表视图中删除项目

Java 单击“删除”按钮,从数据库和列表视图中删除项目,java,android,listview,Java,Android,Listview,我需要从ListView中永久删除一个项目,然后从数据库中删除。我有一个DatabaseHandler.java类,它的delete函数如下: // Deleting single contact, in DatabaseHandler.java class public void deleteContact(Contact contact) { SQLiteDatabase db = this.getWritableDatabase(); db.delete(TABLE_CON

我需要从ListView中永久删除一个项目,然后从数据库中删除。我有一个DatabaseHandler.java类,它的delete函数如下:

// 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中显示为一个项目时。当我长按某个项目时,我会在对话框中选择“删除”和“取消”。现在,当我单击delete时,该项将从ListView中删除,但不会从数据库中删除。如何将其从数据库中删除? 获取“删除”和“取消”选项的代码

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

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


请注意,函数deleteContact具有contact类型的contact变量。

我认为问题在于位置不是数据库中相应的id。一个可能的解决方案是添加一个标记,其中包含此listitem中联系人的数据库id。当您删除它时,您将获得带有id的标记,并从数据库中删除该项

编辑(添加澄清):

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

yourcontactview.setTag(contact.getId());
在其中,您向视图中添加了一个带有相应联系人数据库id的标记

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

Contact deletecontact = db.getContact(view.getTag());
db.deleteContact(deletecontact);
你当然可以改变你的想法 deleteContact(Contact Contact)用于指定id而不是contactobject的方法

希望这能奏效

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

删除时。。。。尝试先从数据库中删除,然后再从列表视图中删除。。
示例:

 db.deleteContact(list.get(posi));  // this will get string  
 list.remove(posi);  
数据库处理程序类……

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

}                                                                  

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

为什么db.deleteContact(posi)被注释掉?@SnapDragon:因为它没有从数据库中删除联系人,我不知道为什么:(.它导致应用程序崩溃,因此,我对其进行了评论以继续调试。请在应用程序崩溃时发布日志crashes@user1903022只需取消对该行的注释并发布堆栈跟踪。@user1903022,不在UI线程中访问DB。这可能会导致崩溃。“Id”将是一个整数类型,因此,您建议在deleteContact中进行什么样的更改(contact)函数,以便posi的整数值可以工作?@user1903022,从适配器获取行的id而不是位置,然后传递它,而不是
contact.getID()
请您用代码给出一个例子。我是Android新手,如果您能帮我举一个例子,我将不胜感激。您需要创建一个联系人对象并将其作为参数传入。但是,您不能只将listview位置作为ID传入数据库中删除,因为它不一定与正确的数据库ID匹配。您是否想过ab使用光标适配器外出?请给出一个示例。我是Android新手,一些带有代码的示例将非常有帮助。它给出的错误如问题的编辑部分所示。问题是数据类型不同。我编辑了我的答案尝试…一次……。@user1903022尝试将联系人更改为stringIt正在删除该项目但是,从ListView中,当我关闭应用程序并再次打开应用程序时,删除后的联系人再次可见。您是否尝试更改我编辑的anwser的代码…您的deleteContact(改为字符串)并且不注释db.deleteContact(list.get(posi));是的,我完全按照你的建议做了。最终的StableArrayAdapter=新的StableArrayAdapter(这个,android.R.layout.simple_list_item_1,list);db.deleteContact(list.get(posi));Log.I(“db-check”,“db-check”+list.get(posi));list.remove(posi);listview.setAdapter(适配器);adapter.notifyDataSetChanged();
 db.deleteContact(list.get(posi));  // this will get string  
 list.remove(posi);  
public void deleteContact(String name){
    Log.d("Name:",""+ name);
    db.delete(TABLE_CONTACTS, KEY_NAME + " = ?", new String[] { name });

}