【问题标题】:Item from SQLite database not deleting within RecyclerViewSQLite 数据库中的项目未在 RecyclerView 中删除
【发布时间】:2016-05-15 06:20:15
【问题描述】:

我有一个 RecyclerView。当我单击删除按钮时,它会从 RecyclerView 中删除一个项目,但是当我重新启动应用程序时,该项目又回来了。这是我的数据库类中的函数:

public boolean deleteList(long rowId) {
    return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
}

这是我的带有删除按钮的适配器类:

@Override
public void onBindViewHolder(RecyclerViewViewHolder viewHolder, final int position) {
    viewHolder.name.setText(list.get(position).name);
    viewHolder.date.setText(list.get(position).date);
    viewHolder.delete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            RecyclerViewListSchema item = list.get(position);
            SQLiteDatabaseAdapter database = new SQLiteDatabaseAdapter(view.getContext());
            database.open();

            boolean deleteList = database.deleteList((long) position);
            list.remove(position);
            notifyItemRemoved(position);

            database.close();
        }
    });
}

更新: 我在deleteList 函数中添加了一个提交函数,如下所示:

public boolean deleteList(long rowId) {
    db.beginTransaction();

    try {
        db.setTransactionSuccessful();
    }

    catch (Exception e) {
        Log.v("Commit", "Error: + " + e);
    }

    finally {
        db.endTransaction();
    }
    return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
}

我也没有在 Android Monitor 中得到任何东西。 我该如何解决这个问题?

【问题讨论】:

  • 列表是从数据库中填充的吗?你错过了提交吗?
  • @dumb_terminal 是的。该列表是从数据库中填充的。
  • 那么该项目肯定没有从数据库中删除。这里可以存在两件事。 1.删​​除逻辑不成功。 2. 删除成功但修改没有提交到db。
  • @dumb_terminal 如何添加提交?
  • db.beginTransaction();尝试 { db.setTransactionSuccessful(); } catch { //数据库事务之间的错误 } finally { db.endTransaction(); }

标签: android sqlite android-sqlite android-recyclerview


【解决方案1】:

您正试图通过传递当前项目位置的值来删除。当然行不通!您需要尝试通过其 ID 或它在 RecyclerView 中的名称来获取该项目,后者意味着您的数据库中的任何项目都不能与 RecyclerView 具有相同的名称。在你的数据库类中试试这个:

public boolean deleteList(String name) {
    return db.delete(DATABASE_TABLE, KEY_NAME + "=" + name, null);
}

在您的适配器中,调用相同的函数,但传递当前项目文本而不是其在 RecyclerView 中的位置。

【讨论】:

  • 现在可以了。最初,它有时会删除,有时却不会。
  • 那是因为当你删除一个项目时,位置发生了变化,你试图删除位置错误的项目。
猜你喜欢
  • 2021-10-27
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-27
  • 2019-05-16
  • 1970-01-01
相关资源
最近更新 更多