Android Studio,尝试从自定义列表视图按钮删除Sql注册表时出错

问题描述 投票:0回答:1

[首先,我知道这个问题必须完成一百万遍,我已经阅读了所有内容,但无法使其正常工作。每行都有一个带有删除按钮的自定义列表视图。那部分工作正常,我可以将单击的对象的数据放在Toastmessage或控制台上,但是当我尝试实现从db方法删除时,应用程序崩溃并报错:“ java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法'java.io.File android.content.Context.getDatabasePath(java.lang.String)'”

好的,现在我将与您分享验证码。首先,Controller类拥有所有用于数据库事务的方法:

    public class ControllerQuirofanos {

        private BaseDatos db;

        public ControllerQuirofanos(Context contexto) {

            db = new BaseDatos(contexto);
        }

//THIS IS THE DELETE METHOD
        public void borrarAlgo (long id) {
            SQLiteDatabase baseDeDatos = db.getWritableDatabase();
            String[] argumentos = {String.valueOf(id)};
            baseDeDatos.delete("quirofanos", "id = ?", argumentos);
        }

        public boolean delete(long id)
        {
            try
            {
                SQLiteDatabase baseDeDatos = db.getWritableDatabase();
                int result=baseDeDatos.delete("quirofanos","id=?",new String[]{String.valueOf(id)});
                if(result>0)
                {
                    return true;
                }

            }catch (SQLException e)
            {
                e.printStackTrace();
            }

            return false;
        }


        public long nuevoQuirofano(Quirofano quirofano) {
            // writable porque vamos a insertar
            SQLiteDatabase baseDeDatos = db.getWritableDatabase();
            ContentValues valoresParaInsertar = new ContentValues();
            valoresParaInsertar.put("nombre", quirofano.getNombre());
            return baseDeDatos.insert("quirofanos", null, valoresParaInsertar);
        }

        //listar
        public ArrayList<Quirofano> obtenerQuirofanos() {
            ArrayList<Quirofano> quirofanos = new ArrayList<>();
            SQLiteDatabase baseDeDatos = db.getReadableDatabase();
            String[] columnasAConsultar = {"id","nombre"};
            Cursor cursor = baseDeDatos.query(
                    "quirofanos",
                    columnasAConsultar,
                    null,
                    null,
                    null,
                    null,
                    null
            );

            if (cursor == null) {
                /*
                    Salimos aquí porque hubo un error, regresar
                    lista vacía
                 */
                return quirofanos;

            }
            if (!cursor.moveToFirst()) return quirofanos;

            do {
                long idQuirofano = cursor.getLong(0);
                String nombreObtenidoDeBD = cursor.getString(1);
                Quirofano personaObtenidaDeDB = new Quirofano(idQuirofano,nombreObtenidoDeBD);
                quirofanos.add(personaObtenidaDeDB);
            } while (cursor.moveToNext());

            cursor.close();
            return quirofanos;
        }


        //borrarTodo
        public void borrarTodo(){
            SQLiteDatabase baseDeDatos = db.getWritableDatabase();
            baseDeDatos.delete("quirofanos", null, null);
        }
    }

然后是自定义适配器类

 public class Adaptador_lista_quirofanos extends BaseAdapter implements ListAdapter {
        private ArrayList<Quirofano> list;
        private Context context;
        final ControllerQuirofanos controller = new ControllerQuirofanos(context) ;


        public Adaptador_lista_quirofanos(ArrayList<Quirofano> list, Context context) {
            this.list = list;
            this.context = context;
        }

        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public Object getItem(int pos) {
            return list.get(pos);
        }

        @Override
        public long getItemId(int pos) {
            return list.get(pos).getId();
            //just return 0 if your list items do not have an Id variable.
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            View view = convertView;
            if (view == null) {
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                view = inflater.inflate(R.layout.fila_quirofano, null);
            }

            //Handle TextView and display string from your list
            TextView listItemText = view.findViewById(R.id.tv_fila_quirofano);
            listItemText.setText(list.get(position).getNombre());

            //Handle buttons and add onClickListeners
            Button deleteBtn = view.findViewById(R.id.btn_eliminar_lista_quirofano);

            deleteBtn.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    final long id_a_eliminar = list.get(position).getId();
                    list.remove(position); //or some other task
                    notifyDataSetChanged(); //this works
                    System.out.println(id_a_eliminar); //this works
                    controller.borrarAlgo(id_a_eliminar); //this is where the app crash

                 }
            });

            listItemText.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String quirofanoClicado = list.get(position).getNombre();
                    Toast.makeText(context.getApplicationContext(), "Clicaste a " + quirofanoClicado, Toast.LENGTH_SHORT).show();
                }
            });

            return view;
        }
    }

数据库助手类

公共类BaseDatos扩展了SQLiteOpenHelper {

    public BaseDatos(Context context) {
        super(context, "administrador.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(String.format("CREATE TABLE IF NOT EXISTS %s(id integer primary key autoincrement, nombre text)", "quirofanos"));
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

}

并且让我知道您是否也需要模型和mainActivity类。有人可以照亮我吗? 4天与此战斗。

非常感谢!我再说一遍,我知道这是一个newby问题(我也是),也为我的英语不好而感到抱歉

java android
1个回答
0
投票

尝试这种方式:

private static String NAME_COL = "id";

private static String TABLE_NAME = "quirofanos";

   public void borrarAlgo (long id) {
        SQLiteDatabase baseDeDatos = db.getWritableDatabase();
        String idConv = String.valueOf(id);
        // -1 is that it failed to delete
        int deleteRow = baseDeDatos.delete(TABLE_NAME, NAME_COL+ "= '" + idConv + "'", null);

    }

将中断点放在行上

// THIS IS THE DELETE METHOD

         public void delete Something (long id) {

             ...

--------> String idConv = String.valueOf (id);


             ...
         }

Check that

public void delete Something (long id) {

...

      ------> SQLiteDatabase databaseData = db.getWritableDatabase ();
             

...
         }

它采用与null(即数据库)不同的值。

© www.soinside.com 2019 - 2024. All rights reserved.