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

Não consigo processar no Emulador

Eu estava desenvolvendo os exercícios executando no smartphone por questões de desempenho, agora nesta aula vi que precisa simular o sms chegando, fui executar no emulador que está funcionando normalmente e aparece o seguinte:

08-08 15:58:43.330 2673-2673/br.com.alura.agenda E/AndroidRuntime: FATAL EXCEPTION: main
                                                                   Process: br.com.alura.agenda, PID: 2673
                                                                   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:75)
                                                                       at br.com.alura.agenda.ListaAlunosActivity.carregaLista(ListaAlunosActivity.java:139)
                                                                       at br.com.alura.agenda.ListaAlunosActivity.onResume(ListaAlunosActivity.java:68)
                                                                       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) 
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
3 respostas

Oi Lucas, tudo bem ?

Manda o código do seu AlunoDao ai, pois está dando problema no Cursor pela exception !

Abraços :D

Olá Matheus!

Segue código, mas conforme falei quando eu executo no smartphone ele roda normal, não sei se é algo por causa do banco desatualizado em um... :

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.support.annotation.NonNull;
import android.widget.Switch;

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

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

/**
 * Created by Birbara on 20/07/2016.
 */
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, " +
                "endereco TEXT, " +
                "telefone TEXT, " +
                "site TEXT, " +
                "nota REAL," +
                "caminhoFoto TEXT);";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

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

    }

    public void insere(Aluno aluno) {

        SQLiteDatabase db = getWritableDatabase();

        ContentValues dados = pegaDadosDoAluno(aluno);

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

    public List<Aluno> buscaAlunos() {

        SQLiteDatabase db = getReadableDatabase();

        Cursor c = db.rawQuery("SELECT * FROM Alunos;", null);

        List<Aluno> alunos = new ArrayList<Aluno>();

        while (c.moveToNext()) {
            Aluno aluno = new Aluno();
            aluno.setId(c.getLong(c.getColumnIndex("id")));
            aluno.setNome(c.getString(c.getColumnIndex("nome")));
            aluno.setEndereco(c.getString(c.getColumnIndex("endereco")));
            aluno.setTelefone(c.getString(c.getColumnIndex("telefone")));
            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 = {String.valueOf(aluno.getId())};
        db.delete("Alunos", "id = ?", params);
    }

    public void altera(Aluno aluno) {
        SQLiteDatabase db = getWritableDatabase();
        String[] params = {String.valueOf(aluno.getId())};
        db.update("Alunos", pegaDadosDoAluno(aluno), "id = ?", params);
    }

    public boolean ehAluno(String telefone){
        SQLiteDatabase db = getReadableDatabase();

        Cursor cursor = db.rawQuery("SELECT * FROM ALUNOS WHERE telefone = ?", new String[]{telefone});

        int count = cursor.getCount();

        cursor.close();

        return count > 0;
    }

    @NonNull
    private ContentValues pegaDadosDoAluno(Aluno aluno) {
        ContentValues dados = new ContentValues();
        dados.put("nome", aluno.getNome());
        dados.put("endereco", aluno.getEndereco());
        dados.put("telefone", aluno.getTelefone());
        dados.put("site", aluno.getSite());
        dados.put("nota", aluno.getNota());
        dados.put("caminhoFoto", aluno.getCaminhoFoto());
        return dados;
    }
}
solução!

Oi Lucas, tudo bem ?

Cara, dei uma olhadinha aqui e vi um probleminha de digitação, provávelmente deve ser esse o problema.

Dá uma olhadinha no seu onUpgrade :

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

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

    }

A palavra "COLLUNM" tá com alguns probleminhas, vamos corriguir isso :

COLUMN

Dá uma olhadinha e troca para a versão 3.

Provavelmente isso deve resolver seu problema.

Abraços :D