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

Erro ao executar o app

Boa tarde pessoal, Após o fim da aula sobre salvar o arquivo de imagem, o aplicativo não executa mais, informando que o mesmo parou.

Alguém pode ajudar?

Agradeço desde já!!

Eis o erro que ocorre:

java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.

package lucas.br.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 java.util.ArrayList; import java.util.List;

import lucas.br.agenda.modelo.Aluno;

/* Created by Lucas on 18/12/2017. */

public class AlunoDAO extends SQLiteOpenHelper {

public AlunoDAO(Context context) { super(context, "Agenda", null, 5); }

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

sqLiteDatabase.execSQL(sql);

}

@Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { String sql = ""; switch (oldVersion) { case 1: sql = "ALTER TABLE Alunos ADD COLLUMN caminhoFoto TEXT"; sqLiteDatabase.execSQL(sql); } }

public void insere(Aluno aluno) {

SQLiteDatabase db = getWritableDatabase();

ContentValues dados = pegaDadosAluno(aluno);

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

}

@NonNull private ContentValues pegaDadosAluno(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; }

public List buscaAlunos() { String sql = "SELECT * FROM Alunos;"; SQLiteDatabase sqLiteDatabase = getReadableDatabase(); Cursor c = sqLiteDatabase.rawQuery(sql,null);

List 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.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 = {aluno.getId().toString()}; db.delete("Alunos","id = ?",params); }

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

ContentValues dados = pegaDadosAluno(aluno);

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

2 respostas
solução!

Oi Lucas td bem? Esse erro provavelmente aconteceu pq vc adicionou uma nova coluna ao banco e os dados antigos não tinham essa informação. Quando vc faz um getLong/getInt/... pelo cursor ele dá esse erro. Como vc está em desenvolvimento poderia reinstalar o app para que todos tenham essa info logo na criação. Caso já esteja com ele em produção vc deveria fazer uma verificação antes pra ver se o cursor não está nulo. Algo como:


try
 {
 if ( !cursor.isNull( columnIndex ) )
 {
 value = cursor.getLong( columnIndex );
 }
 }
 catch ( Throwable tr )
 {
 TRLogger.innerErrorLog( “[c] — “ + columnIndex, tr );
 }

Reinstalei o app e funcionou, muito obrigado Fábio!!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software