【问题标题】:"how to erase correct listview item in sqlite database“如何删除 sqlite 数据库中正确的列表视图项
【发布时间】: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 个时它不会擦除任何内容。

【问题讨论】:

    标签: java android sqlite listview


    【解决方案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();
                }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多