Problem inserting data into Sqlite and updating Recyclerview

Asked

Viewed 86 times

0

I’m having problems in my Sqlite bank where I created a method in my DatabaseController.java who is called recuperarUltimoDigitado() - this method retrieves the entered value and then updates the list.

However, this generates an error in the first attempt to enter the data, but when re-opening the app and adding a new data, it displays a repetition in the list of the same data previously inserted in the RecyclerView and, after that, the next data is entered and listed normally, but I would like to know what I could do to make it be solved and work properly.

public class DatabaseController {

    private DatabaseInit databaseInit;
    private SQLiteDatabase sql;

    public DatabaseController(Context context) {
        databaseInit = new DatabaseInit(context);
        sql = databaseInit.getWritableDatabase();
    }

    public long inserir(Livro livro){
        ContentValues values = new ContentValues();

        values.put(Const.AUTOR_LIVRO, livro.getAutor());
        values.put(Const.EDITORA_LIVRO, livro.getEditora());
        values.put(Const.TITULO_LIVRO, livro.getTitulo());

        return sql.insert(Const.TABLE_NAME, null, values);

    }

    public ArrayList<Livro> recuperar(){
        ArrayList<Livro> livros = new ArrayList<>();

        Cursor cursor = sql.rawQuery("SELECT " +
                Const.TITULO_LIVRO  +  "," +
                Const.EDITORA_LIVRO  +  "," +
                Const.AUTOR_LIVRO  + " FROM "+
                Const.TABLE_NAME , null);

        int indexColumnTitle = cursor.getColumnIndex(Const.TITULO_LIVRO);
        int indexColumnAuthor = cursor.getColumnIndex(Const.AUTOR_LIVRO);
        int indexColumnEditor = cursor.getColumnIndex(Const.EDITORA_LIVRO);

        while (cursor.moveToNext()){
            Livro livro = new Livro();
            livro.setTitulo(cursor.getString(indexColumnTitle));
            livro.setEditora(cursor.getString(indexColumnEditor));
            livro.setAutor(cursor.getString(indexColumnAuthor));
            livros.add(livro);
        }

        cursor.close();

        return livros;
    }

    public Livro recuperarUltimoDigitado(){

        Cursor cursor = sql.rawQuery("SELECT * FROM " + Const.TABLE_NAME + " ORDER BY ID DESC", null);

        int indexColumnTitle = cursor.getColumnIndex(Const.TITULO_LIVRO);
        int indexColumnAuthor = cursor.getColumnIndex(Const.AUTOR_LIVRO);
        int indexColumnEditor = cursor.getColumnIndex(Const.EDITORA_LIVRO);

        if(cursor.moveToFirst()){
            int id = cursor.getInt(cursor.getColumnIndex("id"));
            String titulo = cursor.getString(indexColumnTitle);
            String autor = cursor.getString(indexColumnAuthor);
            String editora = cursor.getString(indexColumnEditor);
            cursor.close();
            return new Livro(id, titulo, autor, editora);
        }

        return null;
    }

}

Method on adapter to notify list update:

    public void adicionarLiivro(Livro livro){
        livros.add(livro);
        notifyItemInserted(getItemCount());
    }

Main Activity:

    public class MainActivity extends AppCompatActivity {

    private EditText autor, titulo, editora;
    private DatabaseController controller;
    private Button btn;
    private RecyclerView recyclerView;
    private ArrayList<Livro> livros;
    private ArrayList<Livro> livrosFiltrados = new ArrayList<>();


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

      autor = findViewById(R.id.autorId);
      titulo = findViewById(R.id.tituloId);
      editora = findViewById(R.id.editoraId);
      controller = new DatabaseController(this);
      livros = controller.recuperar();
      livrosFiltrados.addAll(livros);
      recyclerView = findViewById(R.id.rcyId);

      recyclerView.setLayoutManager(new LinearLayoutManager(this));

      final AdapterListBooks adapter = new AdapterListBooks(livrosFiltrados);
      recyclerView.setAdapter(adapter);

      btn = findViewById(R.id.btnId);

      btn.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {

              Livro livro = new Livro();

              Livro livroRertono = controller.recuperarUltimoDigitado();
              adapter.adicionarLiivro(livroRertono);


              livro.setAutor(autor.getText().toString());
              livro.setTitulo(titulo.getText().toString());
              livro.setEditora(editora.getText().toString());

              long id = controller.inserir(livro);

              Toast.makeText(MainActivity.this, "Livro inserido com o Id: " + id, Toast.LENGTH_SHORT).show();
          }
      });

    }
}

I believe the focus of the problem is on the method recuperarUltimoDigitado().

2 answers

0

Why not use the recover() method to update and bring it all? Then add it to your List and play on Adapter...

  public void adicionarLiivro(Livro livro){
        livros.add(livro);
        notifyItemInserted(getItemCount());
        recuperar();
    }
  • Your answer did not go very well and now I can not even enter data in the bank...

0

I searched a little more and made some edits in the code, where I tried to perform a check whether or not the data was saved (using boolean value). This way in the button click event, I did the insertion normally, but using a variable sucesso receiving the method inserir() returning true or false, that is, whether or not the data has been entered... I will leave the solution here, in case someone in front of a similar problem...

Change in class DatabaseController.java.

public boolean inserir(Livro livro){
        ContentValues values = new ContentValues();

        values.put(Const.AUTOR_LIVRO, livro.getAutor());
        values.put(Const.EDITORA_LIVRO, livro.getEditora());
        values.put(Const.TITULO_LIVRO, livro.getTitulo());

        return sql.insert(Const.TABLE_NAME, null, values) > 0;

    }

Change in class MainActivity.java and in the btn.

btn.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {

              Livro livro = new Livro();

              livro.setAutor(autor.getText().toString());
              livro.setTitulo(titulo.getText().toString());
              livro.setEditora(editora.getText().toString());

              controller = new DatabaseController(getBaseContext());
              boolean sucesso = controller.inserir(livro);

              if (sucesso) {

                  Livro livroRertono = controller.recuperarUltimoDigitado();
                  adapter.adicionarLiivro(livroRertono);


                  Snackbar.make(v, "Salvou!", Snackbar.LENGTH_LONG)
                          .setAction("Action", null).show();

              }else{
                  Snackbar.make(v, "Consulte o LOG!", Snackbar.LENGTH_LONG)
                          .setAction("Action", null).show();
              }

          }
      });

Browser other questions tagged

You are not signed in. Login or sign up in order to post.