Good morning. I have a problem that I can not solve. I'm developing my first Android app and I'm going to stumble over this error, SQLite can not work with Context. I did some research and found no solution. I hope some charitable soul helps me put an end to it. Thanks in advance.
Let's go to the code. The error only appears when I try to delete the item.
DBHelper - method: itemDelete
public class DBHelper extends SQLiteOpenHelper {
private static final String DATABASE = "ListaDeCompras";
private static final String TABLE = "Produtos";
private static final String NOME = "name";
private static final String MARCA = "marca";
private static final String PRECO = "preco";
private static final String TOTAL = "total";
private static final String QUANTIDADE = "quantidade";
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS " + TABLE + "(id INTEGER PRIMARY KEY AUTOINCREMENT, "
+ NOME + " TEXT,"
+ MARCA + " TEXT NULL,"
+ PRECO + " TEXT,"
+ TOTAL + " TEXT,"
+ QUANTIDADE + " TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF NOT EXISTS " + TABLE);
onCreate(db);
}
public boolean insertProduto(String name, String marca, String preco, String total, String quantidade) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues content = new ContentValues();
content.put(NOME, name);
content.put(MARCA, marca);
content.put(PRECO, preco);
content.put(TOTAL, total);
content.put(QUANTIDADE, quantidade);
db.insert(TABLE, null, content);
return true;
}
public ArrayList<Produto> getAllProdutos() {
ArrayList<Produto> array = new ArrayList<Produto>();
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE + " ORDER BY " + NOME, null);
cursor.moveToFirst();
while (cursor.isAfterLast() == false) {
Produto produto = new Produto();
produto.setId(cursor.getInt(cursor.getColumnIndex("id")));
produto.setNome(cursor.getString(cursor.getColumnIndex(NOME)));
produto.setMarca(cursor.getString(cursor.getColumnIndex(MARCA)));
produto.setPreco(cursor.getString(cursor.getColumnIndex(PRECO)));
produto.setTotal(cursor.getString(cursor.getColumnIndex(TOTAL))); produto.setQuantidade(cursor.getString(cursor.getColumnIndex(QUANTIDADE)));
array.add(produto);
cursor.moveToNext();
}
return array;
}
public boolean updatePtoduto(int id, String marca, String preco, String total, String quantidade) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues content = new ContentValues();
content.put("id", id);
content.put(MARCA, marca);
content.put(PRECO, preco);
content.put(TOTAL, total);
content.put(QUANTIDADE, quantidade);
db.update(TABLE, content, "id = ?", new String[]{String.valueOf(id)});
db.close();
return true;
}
public boolean listDelete() {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE, null, null);
db.close();
return true;
}
public void itemDelete(int id) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE, "id = " + id, null);
db.close();
}
public DBHelper(Context context) {
super(context, DATABASE, null, 1);
}
}
Adapter:
public class AdapterProduto extends RecyclerView.Adapter<AdapterProduto.ProdutoViewHolder> {
private Context context;
private ArrayList<Produto> produtos = new ArrayList<Produto>();
public AdapterProduto(MainActivity mainActivity, Context context, ArrayList<Produto> produtos) {
this.context = context;
this.produtos = produtos;
}
@Override
public ProdutoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);
ProdutoViewHolder produtoViewHolder = new ProdutoViewHolder(view, context, produtos);
return produtoViewHolder;
}
@Override
public void onBindViewHolder(ProdutoViewHolder holder, int position) {
Produto produto = produtos.get(position);
holder.tv_nome.setText(produto.getNome());
holder.tv_marca.setText(" " + produto.getMarca());
holder.tv_preco.setText("R$ " + produto.getPreco());
holder.tv_quantidade.setText(produto.getQuantidade() + " unid.");
holder.tv_total.setText("R$ " + produto.getTotal());
}
@Override
public int getItemCount() {
return produtos.size();
}
public class ProdutoViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener {
public TextView tv_nome;
public TextView tv_marca;
public TextView tv_preco;
public TextView tv_quantidade;
public TextView tv_total;
Produto produto;
Context context;
ArrayList<Produto> produtos = new ArrayList<Produto>();
DBHelper dbHelper = new DBHelper(context);
public ProdutoViewHolder(View view, Context context, ArrayList<Produto> produtos) {
super(view);
this.produtos = produtos;
this.context = context;
view.setOnClickListener(this);
view.setOnLongClickListener(this);
tv_nome = (TextView) view.findViewById(R.id.tv_nome);
tv_marca = (TextView) view.findViewById(R.id.tv_marca);
tv_preco = (TextView) view.findViewById(R.id.tv_preco);
tv_quantidade = (TextView) view.findViewById(R.id.tv_quantidade);
tv_total = (TextView) view.findViewById(R.id.tv_total);
}
@Override
public void onClick(View view) {
int position = getAdapterPosition();
produto = this.produtos.get(position);
//passando os dados pra EditActivity
Intent intent = new Intent(this.context, EditActivity.class);
intent.putExtra("id", produto.getId());
intent.putExtra("nome", produto.getNome());
intent.putExtra("marca", produto.getMarca());
intent.putExtra("preco", produto.getPreco());
intent.putExtra("total", produto.getTotal());
intent.putExtra("quantidade", produto.getQuantidade());
this.context.startActivity(intent);
}
@Override
public boolean onLongClick(View view) {
final int position = getAdapterPosition();
final int id = produtos.get(position).getId();
//AlertDialog - mensagem
AlertDialog.Builder alert = new AlertDialog.Builder(context);
alert
.setTitle("Excluir item")
.setMessage("Deseja excluir o item " + tv_nome.getText().toString() + " permanentemente?")
.setCancelable(true)
.setNegativeButton(R.string.title_no, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setPositiveButton(R.string.title_yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dbHelper.itemDelete(id);
Toast.makeText(context, getPosition(), Toast.LENGTH_SHORT).show();
}
});
AlertDialog alertDialog = alert.create();
alertDialog.show();
return true;
}
}
}
Android Monitor:
07-12 09:59:30.962 29172-29172/com.charlespresidente.listadecompras E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.charlespresidente.listadecompras, PID: 29172
java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference
at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223)
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
at com.charlespresidente.listadecompras.database.DBHelper.itemDelete(DBHelper.java:93)
at com.charlespresidente.listadecompras.adapter.AdapterProduto$ProdutoViewHolder$1.onClick(AdapterProduto.java:116)
at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:157)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5527)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:730)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)