“如何删除 sqlite 数据库中正确的列表视图项
Posted
技术标签:
【中文标题】“如何删除 sqlite 数据库中正确的列表视图项【英文标题】:"how to erase correct listview item in sqlite database 【发布时间】:2019-10-27 00:04:27 【问题描述】:我想从数据库中删除列表视图项,如何正确链接每个列表项及其数据库项?
我已经尝试删除 _id 是列表位置的位置,但每次都无法正常工作。
这是我在适配器类上实现侦听器的 viewholder 类和 getView 方法
private class ViewHolder
ImageView imageView;
TextView nom;
Button actualizar,borrar;
@Override
public View getView(final int position, View view, ViewGroup parent)
View fila=view;
ViewHolder holder=new ViewHolder();
if(fila==null)
LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
fila=inflater.inflate(layout,null);
holder.imageView=fila.findViewById(R.id.imagencoche);
holder.nom=fila.findViewById(R.id.nombreCoche);
holder.actualizar=fila.findViewById(R.id.btnAct);
holder.borrar=fila.findViewById(R.id.btnBorrar);
holder.borrar.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
MyOpenHelper db=new MyOpenHelper(context);
db.borrarCoche(position+1+"");
lista=db.selectCoches();
notifyDataSetChanged();
);
fila.setTag(holder);
else
holder=(ViewHolder)fila.getTag();
Coche coche=lista.get(position);
holder.nom.setText(coche.getNombre());
holder.imageView.setImageBitmap(coche.getFoto());
return fila;
从 SQLite 助手调用的 2 方法
public void borrarCoche(String id)
String where="_id=?";
SQLiteDatabase db=this.getWritableDatabase();
db.delete("coches",where,new String[]id);
public ArrayList<Coche> selectCoches()
ArrayList<Coche> lista =new ArrayList<Coche>();
SQLiteDatabase db=this.getReadableDatabase();
Cursor c =db.rawQuery("SELECT nombre, foto, longitud, latitud,_id from coches", null);
if (c.moveToFirst())
do
//recogemos valores
String nom = c.getString(0);
byte[] foto = c.getBlob(1);
float longitud = c.getFloat(2);
float latitud = c.getFloat(3);
int id = c.getInt(4);
Coche coche = new Coche(id, longitud, latitud, DbBitMapUtility.getImage(foto), nom);
lista.add(coche);
while(c.moveToNext());
return lista;
它并不总是正常工作,有时它会擦除另一个条目,或者当只剩下 2 或 1 个时它不会擦除任何内容。
【问题讨论】:
【参考方案1】:第一件事我认为每次删除项目时都不需要从数据库中调用项目。相反,您可以从数据库中删除该项目并从列表中删除该项目并调用 notifyDatasetChanged()。
此外,不要在 getView() 方法中调用 listener,而是在 ViewHoder 类或 onBindViewHolder() 中调用它。所以逻辑将是这样的:
public class MyViewHolder extends RecyclerView.ViewHolder
ImageView imageView;
TextView nom;
Button actualizar,borrar;
public MyViewHolder(View view)
super(view);
holder.imageView=fila.findViewById(R.id.imagencoche);
holder.nom=fila.findViewById(R.id.nombreCoche);
holder.actualizar=fila.findViewById(R.id.btnAct);
holder.borrar=fila.findViewById(R.id.btnBorrar);
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.movie_list_row, parent, false);
return new MyViewHolder(itemView);
@Override
public void onBindViewHolder(MyViewHolder holder, int position)
Coche coche = cocheList.get(position); //Where ArrayList<Coche> cocheList;
holder.nom.setText("demo text");
holder.borrar.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
MyOpenHelper db=new MyOpenHelper(context);
db.borrarCoche(cocheList.getId()); //Don't use position as this is not id rather this is item index value.
cocheList.remove(position);
notifyDataSetChanged();
);
希望你能得到你的解决方案。
为了更好地理解,您可以关注https://www.androidhive.info/2016/01/android-working-with-recycler-view/,了解 Android 中 RecyclerView 的基本概念。
【讨论】:
嗨@Ander Latorre,如果它解决了您的问题,请告诉我。【参考方案2】:问题是你在你的数组中没有 id 来选择一个项目。我用这个,如果你愿意,你可以试试:
Sqlite 代码擦除数据:
public void borrarCoche(int id)
this.openWriteableDB();
String where = ConstantsBD.CAR_ID + " = ?";
db.delete(ConstantsBD.TABLA_COCHES, where, new String[]String.valueOf(id));
this.closeDB();
Sqlite 代码转数组:
public ArrayList selectCoches()
ArrayList list = new ArrayList<>();
this.openReadableDB();
String[] campos = new String[]ConstantsBD.COCHE_ID, //ConstantsBD is a Class where i create the sqlite tables
ConstantsBD.NOM, ConstantsBD.FOTO,
ConstantsBD.LONGITUD,ConstantsBD.LATITUD;
Cursor c = db.query(ConstantsBD.TABLA_COCHES, campos, null, null, null, null, null);
try
while (c.moveToNext())
Coches coches=new Coches();
ic.setIdCoche(c.getInt(0));//Your id always be in zero
ic.setNombre(c.getString(1));
ic.setFoto(c.getBlob(2));
ic.setLongitud(c.getFloat(3));
ic.setLatitud(c.getFloat(4));
list.add(coches);
finally c.close();
this.closeDB();
return list;
以及您的 Activity 中 ListView 的代码:
ListView listView;
ArrayList<Coches> arrayCoches;
SQLITEDB conn;
public void onResume()
super.onResume();
listView = (ListView)findViewById(R.id.lvCoches);
arrayCoches = new ArrayList<Coches>();
conn = new SQLITEDB(getApplicationContext());
arrayCoches=conn.selectCoches();
adt =new adapterCoches(YourActivityName.this, arrayCoches);
lvCam.setAdapter(adt);
lvCam.setOnItemClickListener(new AdapterView.OnItemClickListener()
@Override
public void onItemClick(AdapterView<?> parent, View view,final int position, long id)
AlertDialog.Builder alertbox = new AlertDialog.Builder(YourActivityName.this)
.setTitle("¡Alert!")
.setPositiveButton("Erase", new DialogInterface.OnClickListener()
public void onClick(DialogInterface arg0, int arg1)
SQLITEDB bd = new SQLITEDB(getApplicationContext());
bd.borrarCoche(arrayCoches.get(position).getIdCoches() );
onResume();
)
.setNegativeButton("Update", new DialogInterface.OnClickListener()
public void onClick(DialogInterface arg0, int arg1)
);
alertbox.show();
【讨论】:
以上是关于“如何删除 sqlite 数据库中正确的列表视图项的主要内容,如果未能解决你的问题,请参考以下文章