3
respostas

Durante a busca no banco SQLite ocorre uma sobrescrita dos dados na lista

Olá! Estou aplicando os conteúdo ensinado nas aulas de Android em minha aplicação. Nela preciso buscar as Marcas (salvas no banco SQlite) e mostra-las na ListView assim como no exercício da agenda proposto nas aulas. Porém quando chamo o método buscaMarcas ele sobrescreve os itens que já estavam adicionados na lista.Não sei se fui claro! No Debug verifiquei que durante o while (dentro da buscaMarcas) minha lista se comportava desta maneira:

1 laço do while)
     marca = {Marca@831709767544} "1 - Felipe - Schappo"
    listmarcas = {ArrayList@831709766760}  size = 0
2 lacço do while)
    marca = {Marca@831709767648} "2 - Mayah - 322622255"
     listmarcas = {ArrayList@831709766864}  size = 1
        0 = {Marca@831709767648} "2 - Mayah - 322622255"
3 laço do while)
    marca = {Marca@831709767648} "3 - Melody - 32323232"
    listmarcas = {ArrayList@831709766864}  size = 2
        0 = {Marca@831709767648} "3 - Melody - 32323232"
         1 = {Marca@831709767648} "3 - Melody - 32323232"

Já revisei todo o código, não consigo achar o erro. Qualquer ajuda será bem vinda!


import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.ArrayList;
import java.util.List;

import br.com.showr88mapp.showr88m.modelo.Marca;

public class MarcaDAO extends SQLiteOpenHelper {


    public MarcaDAO(Context context) {
        super(context, "BD_SR", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        String sql = "CREATE TABLE marcas (id INTEGER PRIMARY KEY, nome TEXT NOT NULL, contato TEXT);";
        sqLiteDatabase.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        String sql = "DROP TABLE IF EXISTS marcas;";
        sqLiteDatabase.execSQL(sql);
        onCreate(sqLiteDatabase);
    }

    public void insereMarca(Marca marca){
        SQLiteDatabase db = getWritableDatabase();
        ContentValues dados = new ContentValues();
        dados.put("nome", marca.getNome());
        dados.put("contato", marca.getContato());
        db.insert("marcas", null, dados);
    }

    public List<Marca> buscaMarcas() {
        String sql = "SELECT * FROM marcas";
        SQLiteDatabase database = getReadableDatabase();
        Cursor cursor = database.rawQuery(sql, null);
        List<Marca> listmarcas = new ArrayList<>();
        Marca marca = new Marca();
        while(cursor.moveToNext()){

            marca.setId(cursor.getInt(cursor.getColumnIndex("id")));
            marca.setNome(cursor.getString(cursor.getColumnIndex("nome")));
            marca.setContato(cursor.getString(cursor.getColumnIndex("contato")));
            listmarcas.add(marca);
        }

        cursor.close();
        return listmarcas;
    }

}

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

import java.util.List;

import br.com.showr88mapp.showr88m.DAO.MarcaDAO;
import br.com.showr88mapp.showr88m.modelo.Marca;

public class MarcasAdminActivity extends AppCompatActivity {

    private ListView listaMarcas;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_marcas_admin);
        listaMarcas = findViewById(R.id.marcas_admin_listView);


        Button btnMarcaAdd = findViewById(R.id.marcas_admin_btn_add);
        btnMarcaAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intentVaiParaFormularioMarca = new Intent(MarcasAdminActivity.this, FormularioMarcasActivity.class);
                startActivity(intentVaiParaFormularioMarca);
            }
        });

        registerForContextMenu(listaMarcas);
    }

    @Override
    protected void onResume() {
        super.onResume();
        carregaLista();
    }

    private void carregaLista() {
        MarcaDAO dao = new MarcaDAO(this);

        List<Marca> marcas = dao.buscaMarcas();
        dao.close();

        ArrayAdapter<Marca> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, marcas);
        listaMarcas.setAdapter(adapter);
    }
3 respostas

Felipe, tudo bem ?

Você precisa criar uma nova Marca dentro do for quando está fazendo a busca:

        while(cursor.moveToNext()){
   Marca marca = new Marca();

            marca.setId(cursor.getInt(cursor.getColumnIndex("id")));
            marca.setNome(cursor.getString(cursor.getColumnIndex("nome")));
            marca.setContato(cursor.getString(cursor.getColumnIndex("contato")));
            listmarcas.add(marca);
        }

Fala Matheus tudo certo! Fiz as alterações e não mudou nada. Ele continua salvando Marca, mas sobrescrevendo os valores da ultima marca salva nos itens anteriores da lista.

Desde já agradeço a atenção.

Mostra pra gente como está ?