当前位置: 首页 > 知识库问答 >
问题:

滑动删除在大多数情况下不起作用,它会从视图中删除数据,但不会从SQLite数据库中删除数据

昌砚
2023-03-14

我是一个初学者开发人员。我的应用程序中有一个SQLite数据库。我已经成功地为其添加了添加、删除和更新功能。我现在正在尝试实现滑动删除,但是,我面临着当前的问题:有时在我滑动并删除项目后,它会成功删除(从数据库中),有时不会,有时会删除上面的项目,有时会删除上面的项目2 id。我做了很多尝试和错误,但我无法确认为什么会发生这种情况。总是发生的是项目从视图中删除,因为它不再有自己的卡(我正在使用cardview和回收人员视图)。

以下是相关代码(如果我没有发布任何重要代码,请告诉我,我试图简化这一点):

这是主要的活动。java(这是recyclerview显示卡片的地方)

RecyclerView rv;
MyAdapter adapter;
ArrayList < Player > players = new ArrayList < > ();
int posToDelete;
DBAdapter db = new DBAdapter(this);

//SWIPE TO DELETE
ItemTouchHelper.SimpleCallback simpleItemTouchCallback =
    new ItemTouchHelper.SimpleCallback(0,
        ItemTouchHelper.RIGHT) {
        @Override
        public boolean onMove(RecyclerView recyclerView,
            RecyclerView.ViewHolder viewHolder,
            RecyclerView.ViewHolder target) {
            return false;
        }

        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {

            int position = viewHolder.getAdapterPosition();
            players.remove(position);
            posToDelete = (position);

            delete(position);
            adapter.notifyDataSetChanged();
        }
    };

//recycler
rv = (RecyclerView) findViewById(R.id.myRecycler);


rv.setLayoutManager(new LinearLayoutManager(this));
rv.setItemAnimator(new DefaultItemAnimator());
rv.hasFixedSize();

ItemTouchHelper itemTouchHelper = new
ItemTouchHelper(simpleItemTouchCallback);
itemTouchHelper.attachToRecyclerView(rv);

//DELETE METHOD
public void delete(int id) {
    db.openDB();
    long result = db.Delete(id + 1);

    if (result > 0) {
        //Deleted toast appears but it doesn't get removed from database?
        Toast.makeText(MainActivity.this, "Deleted",
            Toast.LENGTH_SHORT).show();

    } else {
        Toast.makeText(MainActivity.this, "Error",
            Toast.LENGTH_SHORT).show();
    }

    db.close();
}

DBAdapter.java

Context c;
SQLiteDatabase db;
DBHelper helper;

public DBAdapter(Context ctx)
{
    this.c=ctx;
    helper=new DBHelper(c);
}

//OPEN DB
public DBAdapter openDB()
{
    try
    {
        db=helper.getWritableDatabase();
    }catch (SQLException e)
    {
        e.printStackTrace();
    }

    return this;
}

//CLOSE DB
public void close()
{
    try
    {
        helper.close();
    }catch (SQLException e)
    {
        e.printStackTrace();
    }

}

//DELETE FROM DATABASE <---------
public long Delete(int id)
{
    try
    {
        return db.delete(Constants.TB_NAME,Constants.ROW_ID+" =?",new 
String[]{String.valueOf(id)});

    }catch (SQLException e)
    {
        e.printStackTrace();
    }


    return 0;
}

作为一个支题,在调试查找问题的时候,我注意到,在成功地从数据库中删除了一个对象后(使用一直有效的删除功能,而不是滑动删除),数据库只是将该id点留空。所以例如,如果我有对象1,2,3,4,5和6,当我删除5并创建新对象A和B时,似乎数据库将它们存储为1,2,3,4,(此处无),6, A, B。

这是个问题吗?会有什么不好的后果吗?还是这完全正常?

谢谢你。

编辑****你们是对的,传递给delete()方法的位置不是对象的ID,感谢您指出这一点。

我试图使用ViewHolder.getItemId()方法,但它返回一个长。我尝试将其转换为整数,并将整个方法参数更改为接受long而不是整数,但我始终获得的id值是-1,这并没有解决任何问题。

在应用程序的其他地方,我使用onClickListener获取项目的Id,因为它将意图发送到另一个活动。我在想也许我可以在没有任何用户交互的情况下以其他方式获取Id?因为当用户滑动删除时,我真的不能等待onClickListener触发。

共有2个答案

曹沛
2023-03-14

多亏了上面的评论,我发现错误在这里:@Override公共空白 onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {

        int position = viewHolder.getAdapterPosition();
        players.remove(position);
        posToDelete = (position);

        delete(position);
        adapter.notifyDataSetChanged();
    }

我通过创建一个新变量并将该位置的id存储在变量中,然后将新变量传递给delete方法来解决这个问题,如下所示:

                        int position = viewHolder.getAdapterPosition();
                        int checkingId;
                        checkingId = players.get(position).getId();
                        players.remove(position);
                        delete(checkingId);
                        adapter.notifyDataSetChanged();
                    }
饶承宣
2023-03-14

您是否检查过传递给DBAdapter的ID?

看起来您正在根据适配器位置从数据库中删除项目,可能是数据库中项目的这些ID与适配器位置不匹配吗?

我以前做过这个滑动删除的功能,我很确定我使用了物品id,比如从你的玩家数组列表中,然后基于这个从数据库中删除了物品。

 类似资料:
  • 我制作了一个JTable,其中填充了数据库中的数据。它从textfields中获取数据并将其添加到表和数据库中。问题是我有一个删除按钮,我让它从表本身删除选定的行(使用defaultTableModel),但它不会从实际的数据库中删除该数据。当我再次运行该程序时,删除的行再次出现在JTable中。 这可能会变得混乱,但希望有人能找出我错过了什么。帮助将会很感激,但不要,我的时间很少,不能完全大修我

  • 附注。我对Sqlite没有太多的经验

  • 我想从数据库中删除一条特定的记录。

  • 我正试图从数据库中删除一行,但得到以下错误

  • 我有一个jsp网页。我需要删除用户名从数据库当我按删除按钮从网页。我尝试了下面的代码,但是我不能删除名称,而是在用户名数据库中插入一个新行和一个空值。 unblockServlet.java: 受保护的void doPost(HttpServletRequest请求,HttpServletResponse响应)抛出ServletException,IOException{//TODO自动生成的方法

  • 我是JSP的新手,我正在尝试创建一个web界面,用户可以在该界面中输入他们想要删除的信息,并且该信息将在数据库表中删除。 在这里,他们应该输入和,然后应该删除具有两个指定ID的任何数据。但是,它不是从表中删除的。我有个例外 数组索引越界 下面是我的代码: