【问题标题】:How to delete item from Listview AND from database?如何从 Listview 和数据库中删除项目?
【发布时间】:2012-01-27 17:43:20
【问题描述】:

我知道这个问题被问了很多,但我找到的许多答案都不令人满意。

我有一个通过数据库显示列表的 Baseadapter。信息通过游标从数据库传递到列表,游标将游标添加到数组列表,然后填充列表视图。我想通过上下文菜单删除一个列表项,并将其从列表视图和数据库中删除。目前,我正在使用adaptercontextmenuinfo 对象来获取我传递给数据库类中的delete 方法的位置和/或id,但是info.id 与数据库_id 不对应。目前,我能够成功地从 listadapter 中删除行条目,但不能从数据库中删除。任何帮助将非常感激。 (注意:我的数据库有 3 列,第一列是 _id) 上下文菜单 java:

@Override
    public boolean onContextItemSelected(MenuItem item) {
        if(item.getTitle() == "Delete"){ //if "delete" is selected
            AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();

            dba.deleteRow(info.id);
            DATA.remove(info.position);
            adapter.notifyDataSetChanged();

数据库删除行方法:

public void deleteRow(long rowId){
        db = dbhelper.getWritableDatabase();
        try{
            db.delete(Constants.TABLE_NAME, Constants.KEY_ID + "="+rowId,null);
        }catch(Exception e){
        }
    }

我知道这里涉及很多代码。如果你想要更多,请告诉我。感谢您的帮助!

【问题讨论】:

    标签: android sqlite listview


    【解决方案1】:

    Java 中的字符串比较是通过.equals() 或equalsIgnoreCase() 方法完成的,而不是== 这可能是您的声明无法访问的原因。如果您这样做 "this"=="that" 意味着您正在检查它们是否具有相同的参考。 (是的,它是可达的,因为它们都是字符串:P)

    确保您的数据库对象不为空,并检查是否捕获到任何异常。加:尝试从光标中删除数据。

    【讨论】:

    • 谢谢。 if 语句不是问题,该代码可以正确执行。问题是传递 sqlite 数据库行的 _id。我知道 info.id 正在返回列表视图中的行号,这不一定 = sqlite db 的 _id
    • 但是如果你有更多的 if-else 语句会导致你所有的语句都可达。
    • 我认为您不使用数据库中的 id,而是使用 listview 的 id?
    • @nikola:代码已到达,我已通过调试日志确认。
    • stackoverflow.com/questions/6819604/… 这就是我的意思和谈论 :) 是的,它是可以访问的,我对此没有任何争论。 :)
    【解决方案2】:

    我想出了答案。这里是:

            AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
            Cursor c = dba.getsavedcontacts();
            c.moveToPosition(info.position);
            String id = c.getString(c.getColumnIndex(Constants.KEY_ID));
                        dba.open();
                dba.deleteRow(Long.parseLong(id));//remove entry from database according to rowID
                DATA.remove(info.position); //remove entry from arrayadapter, will remove entry from listview
                adapter.notifyDataSetChanged();
                c.close();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 2018-11-19
      • 1970-01-01
      相关资源
      最近更新 更多