NullPointerException while deleting log

1

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)
    
asked by anonymous 12.07.2016 / 15:35

2 answers

0

When you instantiate the Object DBHelper the Context is still null!

Try this:

DBHelper dbHelper = null;

public ProdutoViewHolder(View view, Context context, ArrayList<Produto> produtos) {
    super(view);
    this.produtos = produtos;
    this.context = context;

     // AQUI SEU CONTEXT NAO ESTARÁ NULO!
    this.dbHelper= DBHelper(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);
}
    
12.07.2016 / 16:28
1

I think it's best to pass the activity itself as context:

public AdapterProduto(Activity activity, ArrayList<Produto> produtos) {
  this.context  = activity;
  this.produtos = produtos;
}

In this way your context will be initialized.

    
12.07.2016 / 15:48