Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

11
respostas

Aplicativo nao funciona!

Olá, fiz o código para a criação do BD e atualização, porem ele não mostra nenhum dado (Aluno) inserido na lista após o preenchimento do formulário. O que esta de errado?

package br.com.alura.agenda;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import com.example.rafael.agenda.R;
import java.util.List;
import br.com.alura.agenda.dao.AlunoDAO;
import br.com.alura.agenda.modelo.Aluno;

public class ListaAlunosActivity extends AppCompatActivity {
    //AppCompatActivity = o que aparece na tela do celular

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //Sempre colocar o super para acionar o AppCompatActivity
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lista_alunos);
        //SetContentView = diz de onde vem o conteudo que esta na tela
        //R = pasta "res"

        Button botaoLista = (Button) findViewById(R.id.botao_lista);
        botaoLista.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(ListaAlunosActivity.this, FormularioActivity.class);
                startActivity(intent);
                finish();
            }
        });
    }

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

    private void carregaLista() {
        //BUSCANDO ALUNOS NO BD
        AlunoDAO dao = new AlunoDAO(this);
        List<Aluno> alunos = dao.buscaAlunos();
        dao.close();

        findViewById(R.id.aluno);
        ListView aluno = (ListView) findViewById(R.id.aluno);
        ArrayAdapter<Aluno> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, alunos);
        aluno.setAdapter(adapter);
    }

}
11 respostas

Rafael, tudo bem ?

Cara precisava dar uma olhada no seu Dao e também no seu formulário, pois aparentemente esse código está correto.

Aqui esta meu DAO:

package br.com.alura.agenda.dao;

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.alura.agenda.modelo.Aluno;

//Classe responsavel pelo banco de dados
public class AlunoDAO extends SQLiteOpenHelper{

    //(Contexto, Nome do banco de dados, cursor factory [null], versao do banco de dados)
    public AlunoDAO(Context context) {
        super(context, "Agenda", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE Alunos (id INTEGER PRIMARY KEY, nome TEXT NOT NULL, email TEXT, endereco TEXT, obsevacao TEXT, nota REAL);";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String sql = "DROP TABLE IF EXISTS Alunos"; //deleta a tabela para atualizaçao
        db.execSQL(sql); //executa o comando dado
        onCreate(db);
    }

    public void insere(Aluno aluno){
        SQLiteDatabase db = getWritableDatabase();

        ContentValues dados = new ContentValues();
        dados.put("nome", aluno.getNome());
        dados.put("email", aluno.getEmail());
        dados.put("endereco", aluno.getEndereco());
        dados.put("observacao", aluno.getObservacao());
        dados.put("nota", aluno.getNota());

        db.insert("Agenda", null, dados);
    }

    public List<Aluno> buscaAlunos() {
        SQLiteDatabase db = getReadableDatabase();
        Cursor c = db.rawQuery("SELECT * FROM Alunos;", null);
        List<Aluno> alunos = new ArrayList<>();
        while(c.moveToNext()){
            Aluno aluno = new Aluno();
            aluno.setId(c.getLong(c.getColumnIndex("id")));
            aluno.setNome(c.getString(c.getColumnIndex("nome")));
            aluno.setEmail(c.getString(c.getColumnIndex("email")));
            aluno.setEndereco(c.getString(c.getColumnIndex("endereco")));
            aluno.setObservacao(c.getString(c.getColumnIndex("observacao")));
            aluno.setNota(c.getDouble(c.getColumnIndex("nota")));

            alunos.add(aluno);
        }
        c.close();
        return alunos;
    }
}

E aqui esta meu FormularioActivity:

package br.com.alura.agenda;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import com.example.rafael.agenda.R;
import br.com.alura.agenda.dao.AlunoDAO;
import br.com.alura.agenda.modelo.Aluno;

public class FormularioActivity extends AppCompatActivity {
    private FormularioHelper helper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_formulario);
        helper = new FormularioHelper(this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_formulario, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.menu_formulario:
                Aluno aluno = helper.getAluno();

                AlunoDAO dao = new AlunoDAO(this);
                dao.insere(aluno);
                dao.close();

                Toast.makeText(FormularioActivity.this, "Aluno " + aluno.getNome() + " salvo com sucesso", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(FormularioActivity.this, ListaAlunosActivity.class);
                startActivity(intent);
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }
}

Rafael, o problema está na hora que você irá salvar o aluno.

Você está salvando numa tabela Agenda sendo que você devia salvar em Alunos.

Faz o teste ai e fala para gente !

Matheus, fiz o que você disse,

db.insert("Alunos", null, dados);

porém não esta funcionando ainda.

Rafael,

Você está usando o instant run ? Que faz um hot deploy ?

Isso já devia funcionar.

Chega aparecer algum erro ou informação no console para conseguirmos averiguar ?

Sim ele está no instant run Matheus, o código não mostra nenhum erro. Quando dou "Run" ao abrir o aplicativo ele da este recado no console:

05/26 14:24:32: Launching app
$ adb install-multiple -r C:\Users\Rafael\AndroidStudioProjects\Agenda\app\build\intermediates\split-apk\debug\slices\slice_7.apk C:\Users\Rafael\AndroidStudioProjects\Agenda\app\build\intermediates\split-apk\debug\slices\slice_6.apk C:\Users\Rafael\AndroidStudioProjects\Agenda\app\build\intermediates\split-apk\debug\slices\slice_8.apk C:\Users\Rafael\AndroidStudioProjects\Agenda\app\build\intermediates\split-apk\debug\slices\slice_9.apk C:\Users\Rafael\AndroidStudioProjects\Agenda\app\build\intermediates\split-apk\debug\slices\slice_4.apk C:\Users\Rafael\AndroidStudioProjects\Agenda\app\build\intermediates\split-apk\debug\dep\dependencies.apk C:\Users\Rafael\AndroidStudioProjects\Agenda\app\build\intermediates\split-apk\debug\slices\slice_5.apk C:\Users\Rafael\AndroidStudioProjects\Agenda\app\build\intermediates\split-apk\debug\slices\slice_0.apk C:\Users\Rafael\AndroidStudioProjects\Agenda\app\build\intermediates\split-apk\debug\slices\slice_3.apk C:\Users\Rafael\AndroidStudioProjects\Agenda\app\build\intermediates\split-apk\debug\slices\slice_1.apk C:\Users\Rafael\AndroidStudioProjects\Agenda\app\build\intermediates\split-apk\debug\slices\slice_2.apk C:\Users\Rafael\AndroidStudioProjects\Agenda\app\build\outputs\apk\app-debug.apk 
Split APKs installed
$ adb shell am start -n "com.example.rafael.agenda/br.com.alura.agenda.ListaAlunosActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Client not ready yet..Waiting for process to come online
Connected to process 2664 on device Pixel_API_25 [emulator-5554]

Cara, o instant run faz confusão na maioria das vezes.

Manda rebuildar o projeto.

Já rebuildei Matheus porem não funcionou, sera que o problema não é no Gradle? (esta na versão 3.3 eu acho)

Rafael,

Opa, tudo bem? Eu tive um problema parecido senão idêntico e analisei o logcat, estava retornando:

06-08 03:43:08.539 18944-18944/br.com.alura.agenda E/SQLiteLog: (1) table Alunos has no column named endereco 06-08 03:43:08.540 18944-18944/br.com.alura.agenda E/SQLiteDatabase: Error inserting nome=Teste nota=10.0 endereco=Teste site=Teste telefone=Teste android.database.sqlite.SQLiteException: table Alunos has no column named endereco (code 1): , while compiling: INSERT INTO Alunos(nome,nota,endereco,site,telefone) VALUES (?,?,?,?,?)

Ou seja aconteceu uma falha na "Primeira" criação da tabela, dai então eu mudei o parâmetro do construtor AlunoDAO, de:

super(context, "Agenda", null, 1);

Para

super(context, "Agenda", null, 2);

Com isso chamou o método onUpgrade, a tabela foi recriada e carregou a agenda normalmente.

Olá Rodrigo, então, eu fiz o que você fez porem não funcionou ainda. Como você fez para analisar o logcat? Meu problema deve ser diferente do seu.

Opa Rafael, então eu apenas digitei Java no filter do LogCat.