[首先,我知道这个问题必须完成一百万遍,我已经阅读了所有内容,但无法使其正常工作。每行都有一个带有删除按钮的自定义列表视图。那部分工作正常,我可以将单击的对象的数据放在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问题(我也是),也为我的英语不好而感到抱歉
尝试这种方式:
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(即数据库)不同的值。