Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Exceção Fatal

Boa tarde! Cheguei na ultima parte da Aula02 que trabalha com fotos, mais especificamente persistindo uma foto e o programa não executa mais devido a uma exceção fatal.

Tentei identificar por conta própria, fiz alguns testes e não consegui identificar o problema.

Se alguém puder me orientar nessa busca....

Segue o erro:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: br.com.alura.agenda, PID: 4340
                  java.lang.RuntimeException: Unable to resume activity {br.com.alura.agenda/br.com.alura.agenda.ListaAlunosActivity}: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
                      at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3103)
                      at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
                      at android.app.ActivityThread.-wrap11(ActivityThread.java)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:148)
                      at android.app.ActivityThread.main(ActivityThread.java:5417)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                   Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
                      at android.database.CursorWindow.nativeGetString(Native Method)
                      at android.database.CursorWindow.getString(CursorWindow.java:438)
                      at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
                      at br.com.alura.agenda.dao.AlunoDao.buscaAlunos(AlunoDao.java:76)
                      at br.com.alura.agenda.ListaAlunosActivity.carregaLista(ListaAlunosActivity.java:68)
                      at br.com.alura.agenda.ListaAlunosActivity.onResume(ListaAlunosActivity.java:63)
                      at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1258)
                      at android.app.Activity.performResume(Activity.java:6312)
                      at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3092)
                      at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481) 
                      at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5417) 
                      at java.lang.reflect.Method.invoke(Native Method)
6 respostas

Bruno, tudo bem ?

Cara o problema está sendo no seu DAO, consegue postar ele aqui para gente dar uma olhadinha ?

Abraços

Antes de mais nada, obrigado pela atenção Matheus mais uma vez!

Segue o código do 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 android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.annotation.NonNull;

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

import br.com.alura.agenda.modelo.Aluno;

/**
 * Created by Metal on 15/02/2017.
 */

public class AlunoDao extends SQLiteOpenHelper{
    public AlunoDao(Context context) {

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

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

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String sql = "";

        switch (oldVersion) {
            case 1:
                sql = "ALTER TABLE Alunos add column caminhoFoto TEXT";
                db.execSQL(sql);
        }
    }

    public void insere(Aluno aluno) {
        SQLiteDatabase db = getWritableDatabase();
        ContentValues dados = pegaDadosDoAluno(aluno);
        db.insert("Alunos", null, dados);
    }

    @NonNull
    private ContentValues pegaDadosDoAluno(Aluno aluno) {
        ContentValues dados = new ContentValues();
        dados.put("nome", aluno.getNome());
        dados.put("telefone", aluno.getTelefone());
        dados.put("endereco", aluno.getEndereco());
        dados.put("site", aluno.getSite());
        dados.put("nota", aluno.getNota());
        dados.put("caminhoFoto",aluno.getCaminhoFoto());
        return 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.setTelefone(c.getString(c.getColumnIndex("telefone")));
            aluno.setEndereco(c.getString(c.getColumnIndex("endereco")));
            aluno.setSite(c.getString(c.getColumnIndex("site")));
            aluno.setNota(c.getDouble(c.getColumnIndex("nota")));
            aluno.setCaminhoFoto(c.getString(c.getColumnIndex("caminhoFoto")));
            alunos.add(aluno);
        }
        c.close();
        return alunos;
    }

    public void deleta(Aluno aluno){
        SQLiteDatabase db = getWritableDatabase();
        String[] params = {aluno.getId().toString()};
        db.delete("Alunos","id = ?", params);

    }

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

        String[] params = {aluno.getId().toString()};
        ContentValues dados = pegaDadosDoAluno(aluno);
        db.update("Alunos", dados, "id = ?", params);
    }
}

Bruno, tudo bem ?

Aparentemente seu código está correto, imagino que tenha dito algum problema na hora da atualização, ou seja, quando adicionou o campo caminhoFoto. O que sugiro você a fazer é reinstalar a aplicação e ver se o problema persiste.

Espero ter ajudado.

Abraços

Como eu posso fazer a reinstalação no emulador?

solução!

O emulador é igual a um celular, basta você ficar segurando o ícone do aplicativo no menu e arrastar pra desinstalar. Depois pelo Android studio você precisa instalar como se fosse a primeira vez que rodasse

Obrigado pelas dicas...

Na primeira vez que desinstalei não deu certo, então eu fui à caçada e olha o que encontrei...

String sql = "CREATE TABLE Alunos (id INTEGER PRIMARY KEY, nome TEXT NOT NULL, telefone TEXT NOT NULL, endereco TEXT, telefone TEXT, site TEXT, nota REAL, caminhoFoto TEXT);";

Campo telefone repetido no sql que cria a tabela...

No alter table, estava sem o ponto e vírgula no final do sql tb...