【问题标题】:delete multiple selected items from database via list view?通过列表视图从数据库中删除多个选定项目?
【发布时间】:2020-06-08 04:23:38
【问题描述】:

如何通过列表视图从数据库中删除多个选定的项目?

我找不到怎么做,我找不到如何获取每个选定对象的 ide,或者告诉删除行删除每个选定项

我尝试了很多东西,但我找不到方法,我是新手,所以需要帮助:/

我试图遵循一些教程,但没有,符合

"db.delete("personajes", "codigo=" + **(HERE)**, null);"

我放了“list_items”,但放在这里却给我带来了一个微不足道的错误,显然不是,我在 3 天前尝试过,但什么也没有,我有点沮丧

    package com.example.x.basededatos;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;




public class Consultartlista extends AppCompatActivity {
    private static final String TABLAPERSONAJES = "personajes";
    ListView listapersonajes;
    ArrayList<String> listaInformacion;
    ArrayList lea;
    ArrayList<usuario> listaPerso;
    AdminSQLiteOpenHelper conn;

    public int id;

/********************/
    ArrayList<String> list_items = new ArrayList<String>();
    int count = 0;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_consultartlista);


        conn=new AdminSQLiteOpenHelper(this,"administracion",null,1);


        listapersonajes = (ListView) findViewById(R.id.listapersonajes);

        consultarListaPersonas();
        final ArrayAdapter<String> adaptador=new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,listaInformacion);
        listapersonajes.setAdapter(adaptador);

        /*******/

        listapersonajes.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
        listapersonajes.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
            @Override
            public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
                count = count + 1;
                mode.setTitle(count + " items seleccionados");

                list_items.add(listaInformacion.get(position));


            }

            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                count = 0;
                MenuInflater inflater = mode.getMenuInflater();
                inflater.inflate(R.menu.mymenu1, menu);




                return true;
            }

            @Override
            public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
                return false;
            }

            @Override
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {



                switch (item.getItemId()){
                case R.id.delete_id:
                    for(String msg : list_items){
                        SQLiteDatabase db=conn.getWritableDatabase();
                        db.delete("personajes", "codigo=" + , null);
                        db.close();
                        adaptador.remove(msg);

                    }
                    Toast.makeText(Consultartlista.this, count + " items removidos", Toast.LENGTH_SHORT).show();
                    count = 0;
                    mode.finish();
                    return true;
                  //  break;

                default:
                    return false;


            }



                //return false;
            }

            @Override
            public void onDestroyActionMode(ActionMode mode) {

            }
        });


    }



    public void consultarListaPersonas() {
        AdminSQLiteOpenHelper admin = new AdminSQLiteOpenHelper(this, "administracion", null, 1);
    SQLiteDatabase BaseDatabase = admin.getWritableDatabase();
        SQLiteDatabase db=conn.getReadableDatabase();

        usuario usuario=null;
        listaPerso=new ArrayList<usuario>();
        Cursor cursor=db.rawQuery("SELECT * FROM "+TABLAPERSONAJES,null);

        while (cursor.moveToNext()){
            usuario = new usuario();
            usuario.setCodigo(cursor.getInt(0));
            usuario.setNombre(cursor.getString(1));
            usuario.setContraseña(cursor.getString(2));

            listaPerso.add(usuario);


        }
        obtenerLista();

    }

    private void obtenerLista() {
        listaInformacion=new ArrayList<String>();
        for(int i=0; i<listaPerso.size();i++){
            listaInformacion.add(listaPerso.get(i).getCodigo()+" Nombre: "
                    +listaPerso.get(i).getNombre()+" Contraseña: "
                    +listaPerso.get(i).getContraseña());

        }
    }
}

【问题讨论】:

    标签: javascript java android android-studio


    【解决方案1】:

    您的代码中存在一些问题。首先,在您的 onItemCheckedStateChanged 中,只有当 checked 为真时,您才需要将项目添加到列表中,否则您必须将其从列表中删除。 其次,您的 delete 不完整,但我假设您正在尝试将项目的 id 连接到 where 子句,在您的情况下是错误的,因为您有一个集合。您必须使用所选项目列表过滤您的删除。 SQL 查询应该是这样的:

    DELETE FROM personajes WHERE codigo IN ('codigo1','codigo2','codigo3')
    

    所以,您的 SQLite 删除方法应该如下所示:

    db.delete("personajes", "codigo IN ?" + , String[]{"'codigo1','codigo2','codigo3'"});
    

    您只需要创建一个字符串,其中所有 id 都用单引号括起来并用逗号分隔(如数组)。

    第三,我推荐你看看Room library。它可以帮助您并轻松解决您的问题。

    【讨论】:

    • 你好,我意识到“codigos”不是字符串,是我的数据库的主键,codigos 是用户手动插入的 id,不是自动的,所以,idk 如何检查检查项目中的“codigo”,我想我不知道如何迭代或开发它,你能帮我吗?谢谢。
    • id 是字符串还是整数都没有关系。您需要在删除方法中将字符串数组作为第三个参数传递,即使它们是整数。所以你应该是 db.delete("personajes", "codigo IN ?" + , String[]{"'1','2','3'"});。关于checked items,需要在onItemCheckedStateChanged中进行验证: if(checked) { list_items.add(listaInformacion.get(position)); } else { list_items.remove(listaInformacion.get(position)); } mode.setTitle(list_items.size() + "items seleccionados");
    • 你好 cesar,我意识到你来自秘鲁jaja, mira aqui en esta caja de comentario no me deja responderte con codigos largos, asi que puse una respuesta debajo , puedes leerla, gracias desde ya!
    • locorrecto seria db.delete("personajes", "codigo" + "IN ?", new String[] {String.valueOf(che)}); ya que tienes que filtrar tu consulta por todos los codigos que esten en el array
    • Hola, al ponerlo asi tal cual me dices me pone: (1) "?" 附近: 语法错误。语法错误(代码 1 SQLITE_ERROR):,编译时:DELETE FROM personajes WHERE codigoIN ? luego lo puse de esta forma db.delete("personajes", "codigo" + "=?", new String[] {String.valueOf(che)}); no me crashea , pero no spray efecto el delete, no tengo Mucha exp en almacenar en string asi que pienso que estare almacenando mal los valores en ese string..
    【解决方案2】:

    塞萨尔;

    计数项目的方法现在可以正常工作,但是我试图从数据库中删除检查项目的地方不起作用,没有崩溃,但没有效果。

    公开课上的这个:

    String[] che = {""};
    

    onItemCheckedStateChanged 上的这个

                    if(checked) {
                    list_items.add(listaInformacion.get(position));
                    che = new String[]{listaPerso.get(eee).getCodigo().toString()};
                    eee = eee +1;
    
                } else { list_items.remove(listaInformacion.get(position));
                }
    

    这个要删除

              db.delete("personajes", "codigo" + "=?", new String[] {String.valueOf(che)});
    

    【讨论】:

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