滑动删除在大多数情况下不起作用,它会从视图中删除数据,但不会从 SQLite 数据库中删除数据
Swipe to delete not working most of the time, it removes data from View but not from SQLite Database
我是一名初级开发人员。我的应用程序中有一个 SQLite 数据库。我已经成功地为它添加了添加、删除和更新功能。我现在正在尝试实现滑动删除,但是,我面临当前的问题:有时在我滑动并删除该项目后,它会成功删除(从数据库中),有时不会,有时会删除上述项目,有时它上面的项目有 2 个 id。我做了很多试验和错误,但我无法确认为什么会这样。
经常发生的是该项目从视图中删除,因为它不再有自己的卡片(我正在使用带有 recyclerview 的 cardview)。
这是相关代码(如果我没有发布任何重要代码,请告诉我,我尽量简化了这个):
MainActivity.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()
方法,但它 returns 是 long
。我尝试将其转换为 integer
并更改整个方法参数以接受 long
而不是 integer
但我总是得到的 id 值是 -1
,这没有解决任何东西。
在应用程序的其他地方,我使用 onClickListener
获取项目的 ID,因为它将 intent
发送到另一个 activity。我在想也许我可以通过其他方式获得 Id 而无需任何用户交互?因为我真的等不及 onClickListener
在用户滑动删除时触发。
您检查过传递给您的 DBAdapter 的 ID 了吗?
您似乎是根据适配器位置从数据库中删除项目,会不会是数据库中这些项目的 ID 与适配器位置不匹配?
我以前做过这个 swipe-to-delete 功能,我很确定我使用了物品 ID,例如从你的玩家数组列表中,并根据数据库中的那个删除了物品。
感谢上面的评论,我发现错误在这里:
@覆盖
public void 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();
}
我是一名初级开发人员。我的应用程序中有一个 SQLite 数据库。我已经成功地为它添加了添加、删除和更新功能。我现在正在尝试实现滑动删除,但是,我面临当前的问题:有时在我滑动并删除该项目后,它会成功删除(从数据库中),有时不会,有时会删除上述项目,有时它上面的项目有 2 个 id。我做了很多试验和错误,但我无法确认为什么会这样。 经常发生的是该项目从视图中删除,因为它不再有自己的卡片(我正在使用带有 recyclerview 的 cardview)。
这是相关代码(如果我没有发布任何重要代码,请告诉我,我尽量简化了这个):
MainActivity.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()
方法,但它 returns 是 long
。我尝试将其转换为 integer
并更改整个方法参数以接受 long
而不是 integer
但我总是得到的 id 值是 -1
,这没有解决任何东西。
在应用程序的其他地方,我使用 onClickListener
获取项目的 ID,因为它将 intent
发送到另一个 activity。我在想也许我可以通过其他方式获得 Id 而无需任何用户交互?因为我真的等不及 onClickListener
在用户滑动删除时触发。
您检查过传递给您的 DBAdapter 的 ID 了吗?
您似乎是根据适配器位置从数据库中删除项目,会不会是数据库中这些项目的 ID 与适配器位置不匹配?
我以前做过这个 swipe-to-delete 功能,我很确定我使用了物品 ID,例如从你的玩家数组列表中,并根据数据库中的那个删除了物品。
感谢上面的评论,我发现错误在这里: @覆盖 public void 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();
}