17
respostas

Erro de Execução do projeto

Prezados, boa tarde! Quando executo o aplicativo sem dados ele deveria obter os dados que estão no servidor. Porém isso não acontece. Fiz testes inserindo aluno pelo aplicativo. A inserção é realizada, pois atualizo o servidor e aparece o aluno inserido. Mas o aplicativo não traz ninguem. Segue erro abaixo para ajuda caso seja o problema em questão. Obrigado!

insira seu código aqui
380-2413/br.com.alura.agenda D/OkHttp: --> GET http://192.168.0.6:8080/api/aluno http/1.1
07-08 14:57:13.499 1537-1562/system_process I/ActivityManager: Displayed br.com.alura.agenda/.ListaAlunosActivity: +1s400ms
07-08 14:57:18.883 2380-2413/br.com.alura.agenda D/OkHttp: <-- 200 OK http://192.168.0.6:8080/api/aluno (5652ms)
07-08 14:57:18.889 2380-2413/br.com.alura.agenda D/OkHttp: {"alunos":[{"id":"0e2b3898-dd5f-45b7-b00a-3d9686f2776c","nome":"Adriano Abreu","endereco":"dsadsa","telefone":"999999999","site":"dsadasd","nota":10.0,"desativado":0,"idCliente":0},{"id":"11b71485-ed56-4940-bebd-3b642fe22f78","nome":"Juliana","endereco":"Avenida dos Democraticos","telefone":"123456","site":"dasdasd","nota":10.0,"desativado":0,"idCliente":0},{"id":"18907ea1-0260-4fa8-a461-666e042ac70c","nome":"Bruno","endereco":"Rua do Bruno","telefone":"123456789","site":"www.sitedobruno.com.br","nota":10.0,"caminhoFoto":"/storage/emulated/0/Android/data/br.com.alura.agenda/files/Pictures/JPEG_20170706_000838_1256134065.jpg","desativado":0,"idCliente":3},{"id":"1ce670c1-51dc-4dc9-8502-cd0f2c943ab3","nome":"Tiago","endereco":"Werneck","telefone":"999999999","site":"www.sitedotiago.com.br","nota":10.0,"desativado":0,"idCliente":5},{"id":"2b6aed11-ab43-4059-916a-6bc977e140f9","nome":"Antonio Carlos Abreu","endereco":"Rua do Carlinhos","telefone":"999195592","site":"www.google.com.br","nota":10.0,"desativado":0,"idCliente":2},{"id":"33a517a5-f0e9-4c3f-b44c-f07c458e0b68","nome":"Debora","endereco":"JPA","telefone":"999999999","site":"www.debora.com.br","nota":10.0,"desativado":0,"idCliente":0},{"id":"3a5a9e43-898d-4ad7-894e-385b6616baaf","nome":"Thamires","endereco":"Rua da Thamires","telefone":"999999999","site":"","nota":6.0,"desativado":0,"idCliente":4},{"id":"45f41465-4f6c-46f2-8339-66a188838a39","nome":"Penha","endereco":"rua da penha","telefone":"999999999","site":"www.sitedapenha.com","nota":10.0,"desativado":0,"idCliente":0},{"id":"a2e3b097-ec35-413a-8d60-6c031946f9ca","nome":"Daniel","endereco":"Rua do Daniel","telefone":"999999999","site":"www.sitedodaniel.com.br","nota":10.0,"desativado":0,"idCliente":0},{"id":"baebe8aa-5ed0-4be3-bbd2-2f315f5bc229","nome":"Anete","endereco":"sadsad","telefone":"123456","site":"daasdf","nota":10.0,"desativado":0,"idCliente":0},{"id":"bf04cef6-bf06-4e82-9ba6-7fdf22d99f34","nome":"Maria Conceiçao","endereco":"rua da ceicao","telefone":"999999999","site":"www.ceicao.com.br","nota":10.0,"desativado":0,"idCliente":0},{"id":"d4c9f571-7c09-44c4-9c46-57cfe5f315c6","nome":"Andre Luis Machado Abreu","endereco":"Rua Eudoro Berlinck","telefone":"25603736","site":"www.unisuam.edu.br","nota":10.0,"desativado":0,"idCliente":0},{"id":"e7859988-83a2-4e36-84b0-74fd4e9f821f","nome":"Andre Luis Machado Abreu","endereco":"Rua Eudoro Berlinck","telefone":"25603736","site":"www.unisuam.edu.br","nota":10.0,"desativado":0,"idCliente":1}],"momentoDaUltimaModificacao":"2017-07-08T11:57:18.883"}
07-08 14:57:18.915 2380-2380/br.com.alura.agenda E/SQLiteLog: (20) statement aborts at 5: [INSERT INTO Alunos(caminhoFoto,endereço,nome,nota,id,site,telefone) VALUES (?,?,?,?,?,?,?)] datatype mismatch
07-08 14:57:18.915 2380-2380/br.com.alura.agenda E/SQLiteDatabase: Error inserting caminhoFoto=null endereço=dsadsa nome=Adriano Abreu nota=10.0 id=0e2b3898-dd5f-45b7-b00a-3d9686f2776c site=dsadasd telefone=999999999
                                                                   android.database.sqlite.SQLiteDatatypeMismatchException: datatype mismatch (code 20)
                                                                       at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
                                                                       at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
                                                                       at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
                                                                       at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
                                                                       at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1474)
                                                                       at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1343)
                                                                       at br.com.alura.agenda.dao.AlunoDao.insere(AlunoDao.java:121)
                                                                       at br.com.alura.agenda.dao.AlunoDao.sincroniza(AlunoDao.java:204)
                                                                       at br.com.alura.agenda.ListaAlunosActivity$3.onResponse(ListaAlunosActivity.java:99)
                                                                       at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70)
                                                                       at android.os.Handler.handleCallback(Handler.java:751)
                                                                       at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                       at android.os.Looper.loop(Looper.java:154)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
17 respostas

E ai Victor, tudo bem?Pode mandar o sql do teu banco de dados para uma análise melhor?

Segue abaixo a classe AlunoDao

public class AlunoDao extends SQLiteOpenHelper{

    // O Construtor AlunoDao recebe a ListaAlunosActivity como Parâmetro.
    public AlunoDao(Context context) {

        //super(context, "Agenda", null, 1);
        //super(context, "Agenda", null, 2);
        super(context, "Agenda", null, 9);
    }

    //Método que Cria as tabelas do Banco de Dados
    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE Alunos (id INTEGER PRIMARY KEY," +
                " nome TEXT NOT NULL," +
                " endereço TEXT," +
                " telefone TEXT," +
                " site TEXT," +
                " nota REAL," +
                " caminhoFoto TEXT);";
        db.execSQL(sql);
        Log.i("Criou tabela Alunos", null);
    }

    // Metodo que atualiza o Banco de Dados com alterações feitas na tabela e disponibiliza para o usuário.
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //String sql = "DROP TABLE IF EXISTS Alunos";
        String sql = "";
        switch (oldVersion) {
            case 1:
                Log.i("Entrou no case2", null);
                sql = "ALTER TABLE Alunos ADD COLUMN caminhoFoto TEXT";
                db.execSQL(sql); // indo para versao 2
                //break;

            case 2:
                String criandoTabelaNova = "CREATE TABLE Alunos_novo " +
                        "(id CHAR(36) PRIMARY KEY" +
                        ", nome TEXT NOT NULL, " +
                        "endereço TEXT, " +
                        "telefone TEXT, " +
                        "site TEXT, " +
                        "nota REAL, " +
                        "caminhoFoto TEXT)";
                db.execSQL(criandoTabelaNova); // indo para versao 3


                //Inserindo alunos existentes na tabela antiga
                String inserindoAlunosNaTabelaNova = "INSERT INTO Alunos_novo " +
                        "(id, nome, endereço, telefone, site, nota, caminhoFoto) " +
                        "SELECT id, nome, endereço, telefone, site, nota, caminhoFoto " +
                        "FROM Alunos";
                db.execSQL(inserindoAlunosNaTabelaNova);


                // removendo tabela antiga
                String removendoTabelaAntiga = "DROP TABLE Alunos";
                db.execSQL(removendoTabelaAntiga);

                // alterando nome da tabela Alunos_novo para Alunos
                String alterandoNomeDaTabelaNova = "ALTER TABLE Alunos_novo " +
                        "RENAME TO Alunos";
                db.execSQL(alterandoNomeDaTabelaNova);

//            case 3:
// /               String buscaAlunos = "SELECT * FROM Alunos";
//                Cursor cursor = db.rawQuery(buscaAlunos, null);
//                Log.i("Entrou no case3", null);
//                List<Aluno> alunos = populaAlunos(cursor);

//                String atualizaIdDoAluno = "UPDATE Alunos SET id = ? WHERE id = ?";
//                for (Aluno aluno: alunos) {
//                    Log.i("Entrou no UPDATE", aluno.getId());
//                    db.execSQL(atualizaIdDoAluno, new String[] {geraUUID(),aluno.getId()});
//                }
            case 8:
                String buscaAlunos = "SELECT * FROM Alunos";
                Cursor cursor = db.rawQuery(buscaAlunos, null);

                List<Aluno> alunos = populaAlunos(cursor);

                String atualizaIdDoAluno = "UPDATE Alunos SET id = ? WHERE id = ?";
                for (Aluno aluno: alunos) {
                    Log.i("Entrou no UPDATE", aluno.getId());
                    db.execSQL(atualizaIdDoAluno, new String[] {geraUUID(),aluno.getId()});
                }

                //break;


        }
//        onCreate(db);
    }

    private String geraUUID() {
        return UUID.randomUUID().toString();
    }

    public void insere(Aluno aluno){
        // A query SQL INSERT é realizada pelo SQLiteDatabase.
        SQLiteDatabase db = getWritableDatabase();
        insereIdSeNecessario(aluno);
        ContentValues dados = pegaDadosDoAluno(aluno);
        // Metodo chamando comando INSERT.
        db.insert("Alunos", null, dados);
        //aluno.setId(id);
    }

    private void insereIdSeNecessario(Aluno aluno) {
        if(aluno.getId() == null){
            aluno.setId(geraUUID());
        }
    }

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

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

        List<Aluno> alunos = populaAlunos(c);
        c.close();

        return alunos;
    }

    @NonNull
    private List<Aluno> populaAlunos(Cursor c) {
        List<Aluno> alunos = new ArrayList<Aluno>();
        while (c.moveToNext()) {
            Aluno aluno = new Aluno();
            aluno.setId(c.getString(c.getColumnIndex("id")));
            aluno.setNome(c.getString(c.getColumnIndex("nome")));
            aluno.setEndereco(c.getString(c.getColumnIndex("endereço")));
            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);

        }
        return alunos;
    }


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

        // Array de Parametros para a clausula Where do Delete.
        String[] params = {aluno.getId().toString()};
        db.delete("Alunos", "id = ?", params);

    }

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

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

    public boolean ehAluno(String telefone) {
        SQLiteDatabase db = getReadableDatabase();
        Cursor c = db.rawQuery("SELECT * FROM Alunos WHERE telefone = ?", new String[]{telefone});
        int resultados = c.getCount();
        c.close();
        return resultados > 0;
    }

    public void sincroniza(List<Aluno> alunos) {
        for (Aluno aluno: alunos) {
            if(existe(aluno)){
                altera(aluno);
            }else{
                insere(aluno);
            }
        }
    }

    private boolean existe(Aluno aluno) {
        SQLiteDatabase db = getReadableDatabase();
        String existe = "SELECT id FROM Alunos WHERE id = ? LIMIT 1";
        Cursor cursor = db.rawQuery(existe, new String[]{aluno.getId()});
        int quantidade = cursor.getCount();
        return quantidade > 0;
    }
}

Não tenho certeza se o banco aceita caracteres especiais, mas em todo atributo endereco do seu banco ta com 'ç', tenta corrigir isso e ve se funfa.

Tentei fazer a alteração, mas quando executo para a aplicação

            case 10:
                String alterandoNomeDaTabelaAlunos = "ALTER TABLE Alunos " +
                        "RENAME TO Alunos_novo";
                db.execSQL(alterandoNomeDaTabelaAlunos);
                String criandoTabelaNovaAlunos = "CREATE TABLE Alunos " +
                        "(id CHAR(36) PRIMARY KEY" +
                        ", nome TEXT NOT NULL, " +
                        "endereco TEXT, " +
                        "telefone TEXT, " +
                        "site TEXT, " +
                        "nota REAL, " +
                        "caminhoFoto TEXT)";
                db.execSQL(criandoTabelaNovaAlunos);

Você alterou a versão do banco para 10?

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

Ah, e lembrando que onde você ta buscando esse campo endereço todos os lugares estão com ç. Verificou se alterou em todo lugar do código?

Sim, fiz as duas coisas. Fiz vários testes que fiquei perdido. Segue o código atual abaixo:

public class AlunoDao extends SQLiteOpenHelper{

    // O Construtor AlunoDao recebe a ListaAlunosActivity como Parâmetro.
    public AlunoDao(Context context) {

        //super(context, "Agenda", null, 1);
        //super(context, "Agenda", null, 2);
        super(context, "Agenda", null, 15);
    }

    //Método que Cria as tabelas do Banco de Dados
    @Override
    public void onCreate(SQLiteDatabase db) {
        //String sql = "CREATE TABLE Alunos (id INTEGER PRIMARY KEY," +
          String sql = "CREATE TABLE Alunos (id CHAR(36) PRIMARY KEY," +
                " nome TEXT NOT NULL," +
                " endereço TEXT," +
                " telefone TEXT," +
                " site TEXT," +
                " nota REAL," +
                " caminhoFoto TEXT);";
        db.execSQL(sql);
//        Log.i("Criou tabela Alunos", null);
    }

    // Metodo que atualiza o Banco de Dados com alterações feitas na tabela e disponibiliza para o usuário.
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //String sql = "DROP TABLE IF EXISTS Alunos";
        String sql = "";
        switch (oldVersion) {
            case 1:
                Log.i("Entrou no case2", null);
                sql = "ALTER TABLE Alunos ADD COLUMN caminhoFoto TEXT";
                db.execSQL(sql); // indo para versao 2
                //break;

            case 2:
                String criandoTabelaNova = "CREATE TABLE Alunos_novo " +
                        "(id CHAR(36) PRIMARY KEY" +
                        ", nome TEXT NOT NULL, " +
                        "endereço TEXT, " +
                        "telefone TEXT, " +
                        "site TEXT, " +
                        "nota REAL, " +
                        "caminhoFoto TEXT)";
                db.execSQL(criandoTabelaNova); // indo para versao 3


                //Inserindo alunos existentes na tabela antiga
                String inserindoAlunosNaTabelaNova = "INSERT INTO Alunos_novo " +
                        "(id, nome, endereço, telefone, site, nota, caminhoFoto) " +
                        "SELECT id, nome, endereço, telefone, site, nota, caminhoFoto " +
                        "FROM Alunos";
                db.execSQL(inserindoAlunosNaTabelaNova);


                // removendo tabela antiga
                String removendoTabelaAntiga = "DROP TABLE Alunos";
                db.execSQL(removendoTabelaAntiga);

                // alterando nome da tabela Alunos_novo para Alunos
                String alterandoNomeDaTabelaNova = "ALTER TABLE Alunos_novo " +
                        "RENAME TO Alunos";
                db.execSQL(alterandoNomeDaTabelaNova);

//            case 3:
// /               String buscaAlunos = "SELECT * FROM Alunos";
//                Cursor cursor = db.rawQuery(buscaAlunos, null);
//                Log.i("Entrou no case3", null);
//                List<Aluno> alunos = populaAlunos(cursor);

//                String atualizaIdDoAluno = "UPDATE Alunos SET id = ? WHERE id = ?";
//                for (Aluno aluno: alunos) {
//                    Log.i("Entrou no UPDATE", aluno.getId());
//                    db.execSQL(atualizaIdDoAluno, new String[] {geraUUID(),aluno.getId()});
//                }
//            case 11:
//                String buscaAlunos = "SELECT * FROM Alunos";
//                Cursor cursor = db.rawQuery(buscaAlunos, null);

//                List<Aluno> alunos = populaAlunos(cursor);

//                String atualizaIdDoAluno = "UPDATE Alunos SET id = ? WHERE id = ?";
//                for (Aluno aluno: alunos) {
//                    Log.i("Entrou no UPDATE", aluno.getId());
//                    db.execSQL(atualizaIdDoAluno, new String[] {geraUUID(),aluno.getId()});
//                }
            case 12:
                String alterandoNomeDaTabelaAlunos = "ALTER TABLE Alunos " +
                        "RENAME TO Alunos_novo";
                db.execSQL(alterandoNomeDaTabelaAlunos);
                String criandoTabelaNovaAlunos = "CREATE TABLE Alunos " +
                        "(id CHAR(36) PRIMARY KEY" +
                        ", nome TEXT NOT NULL, " +
                        "endereco TEXT, " +
                        "telefone TEXT, " +
                        "site TEXT, " +
                        "nota REAL, " +
                        "caminhoFoto TEXT)";
                db.execSQL(criandoTabelaNovaAlunos);
                //break;

            case 13:
                //Inserindo alunos existentes na tabela antiga
                String inserindoAlunosNaTabelaNovaAluno = "INSERT INTO Alunos " +
                        "(id, nome, endereco, telefone, site, nota, caminhoFoto) " +
                        "SELECT id, nome, endereço, telefone, site, nota, caminhoFoto " +
                        "FROM Alunos_novo";
                db.execSQL(inserindoAlunosNaTabelaNovaAluno);


                // removendo tabela antiga
                String removendoTabelaAntigaN = "DROP TABLE Alunos_novo";
                db.execSQL(removendoTabelaAntigaN);

            case 14:
                String buscaAlunos = "SELECT * FROM Alunos";
                Cursor cursor = db.rawQuery(buscaAlunos, null);

                List<Aluno> alunos = populaAlunos(cursor);

                String atualizaIdDoAluno = "UPDATE Alunos SET id = ? WHERE id = ?";
                for (Aluno aluno: alunos) {
                    Log.i("Entrou no UPDATE", aluno.getId());
                    db.execSQL(atualizaIdDoAluno, new String[] {geraUUID(),aluno.getId()});
                }

        }
//        onCreate(db);
    }

    private String geraUUID() {
        return UUID.randomUUID().toString();
    }

    public void insere(Aluno aluno){
        // A query SQL INSERT é realizada pelo SQLiteDatabase.
        SQLiteDatabase db = getWritableDatabase();
        insereIdSeNecessario(aluno);
        ContentValues dados = pegaDadosDoAluno(aluno);
        // Metodo chamando comando INSERT.
        db.insert("Alunos", null, dados);
        //aluno.setId(id);
    }

    private void insereIdSeNecessario(Aluno aluno) {
        if(aluno.getId() == null){
            aluno.setId(geraUUID());
        }
    }

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

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

        List<Aluno> alunos = populaAlunos(c);
        c.close();

        return alunos;
    }

    @NonNull
    private List<Aluno> populaAlunos(Cursor c) {
        List<Aluno> alunos = new ArrayList<Aluno>();
        while (c.moveToNext()) {
            Aluno aluno = new Aluno();
            aluno.setId(c.getString(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);

        }
        return alunos;
    }


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

        // Array de Parametros para a clausula Where do Delete.
        String[] params = {aluno.getId().toString()};
        db.delete("Alunos", "id = ?", params);

    }

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

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

    public boolean ehAluno(String telefone) {
        SQLiteDatabase db = getReadableDatabase();
        Cursor c = db.rawQuery("SELECT * FROM Alunos WHERE telefone = ?", new String[]{telefone});
        int resultados = c.getCount();
        c.close();
        return resultados > 0;
    }

    public void sincroniza(List<Aluno> alunos) {
        for (Aluno aluno: alunos) {
            if(existe(aluno)){
                altera(aluno);
            }else{
                insere(aluno);
            }
        }
    }

    private boolean existe(Aluno aluno) {
        SQLiteDatabase db = getReadableDatabase();
        String existe = "SELECT id FROM Alunos WHERE id = ? LIMIT 1";
        Cursor cursor = db.rawQuery(existe, new String[]{aluno.getId()});
        int quantidade = cursor.getCount();
        return quantidade > 0;
    }
}

Caracas man, kkk. Não sei o que pode ser então. Só esperar os universitários agora.

Oi Victor, tudo bem? O motivo por ter acontecido o erro, provavelmente é pelo ç. Sempre evite tais caracteres para nomes de variáveis ou campos do banco de dados.

Percebi também que você ficou um pouco perdido nessa parte do curso. Quando acontece esse tipo de detalhe, é importante apontar o momento da aula que não ficou tão claro, pois dessa forma fica mais fácil de auxiliarmos :)

Portanto me fala em qual aula do curso você teve problema que eu posso verificar a melhor maneira pra te ajudar, pois toda aula existe o projeto que foi feito na aula anterior, portanto, poderei direcionar você até esse ponto. Claro, se for em um exercício em específico, melhor ainda.

[]s

Alex, refiz o curso esta semana, por isso a demora para responder. Na ultima execução do projeto aconteceu novamente o erro abaixo. Já conferi versionamento do banco e criei o banco com o campo endereço sem o 'ç'. Não sei realmente o que pode ser...

07-13 00:05:08.753 9935-9956/br.com.alura.agenda D/OkHttp: <-- 200 OK http://192.168.0.6:8080/api/aluno (913ms)
07-13 00:05:08.753 9935-9956/br.com.alura.agenda D/OkHttp: Server: Apache-Coyote/1.1
07-13 00:05:08.753 9935-9956/br.com.alura.agenda D/OkHttp: Content-Type: application/json;charset=UTF-8
07-13 00:05:08.753 9935-9956/br.com.alura.agenda D/OkHttp: Transfer-Encoding: chunked
07-13 00:05:08.753 9935-9956/br.com.alura.agenda D/OkHttp: Date: Thu, 13 Jul 2017 00:05:09 GMT
07-13 00:05:08.754 9935-9956/br.com.alura.agenda D/OkHttp: {"alunos":[{"id":"00bed7d8-6cac-42c5-994b-b4fa8fbabb57","nome":"Taiana","endereco":"Belford Roxo","telefone":"888888888","site":"www.sitedataiana.com.br","nota":10.0,"desativado":0,"idCliente":0},{"id":"0f6f86e6-1b58-46f8-850f-acf48da6b8ef","nome":"Tereza","endereco":"Engenho de Dentro","telefone":"999999999","site":"www.sitedatereza.com.br","nota":10.0,"desativado":0,"idCliente":0},{"id":"2deb81c9-c8b8-4915-b61d-a3dc89e324b6","nome":"safasfa","endereco":"fdasfsd","telefone":"99999999","site":"sdcasdas","nota":10.0,"desativado":0,"idCliente":1},{"id":"40f60de4-4db8-406c-87f2-0fd44e02f725","nome":"Iasmin Cruz","endereco":"Avenida dos Democraticos","telefone":"983349902","site":"www.facebook.com","nota":10.0,"desativado":0,"idCliente":4},{"id":"4d9416d7-f970-4f82-a428-eb097422fd6e","nome":"Daniel Primo","endereco":"sdasdfsa","telefone":"22222222","site":"dsafdsa","nota":10.0,"desativado":0,"idCliente":0},{"id":"5a9d197c-c1cf-4c84-ae18-160b6607d864","nome":"Andre Luis Machado Abreu","endereco":"Rua Eudoro Berlinck","telefone":"980841298","site":"www.facebook.com","nota":10.0,"desativado":0,"idCliente":3},{"id":"832f4804-0d5d-40a2-bda5-baef0ac796db","nome":"Carlinhos","endereco":"Rua Eudoro Berlinck","telefone":"999195592","site":"www.sitedocarlinhos.com","nota":10.0,"desativado":0,"idCliente":5},{"id":"d2febcae-f944-4cd1-8b2f-052dd6fca825","nome":"Rafael","endereco":"Rua do Rafael","telefone":"999999999","site":"www.facebook.com","nota":10.0,"desativado":0,"idCliente":7},{"id":"d9b70ebc-df09-4f9c-8ee3-fd16d4088518","nome":"Ceicao","endereco":"Rua Eudoro Berlinck","telefone":"999999999","site":"www.sitedaceicao.com.br","nota":10.0,"desativado":0,"idCliente":6},{"id":"e21d8182-1c29-48f3-bede-bd2effd771c6","nome":"Adriano","endereco":"Rua Eudoro Berlinck","telefone":"998483720","site":"www.alura.com.br","nota":10.0,"caminhoFoto":"/storage/emulated/0/Android/data/br.com.alura.agenda/files/Pictures/JPEG_20170710_222923_711164453.jpg","desativado":0,"idCliente":2},{"id":"e915e7be-4937-4f9c-b156-4f7bd5925fa5","nome":"Vinicius","endereco":"Rua do Vinicius","telefone":"999999999","site":"csafdasd","nota":10.0,"desativado":0,"idCliente":8}],"momentoDaUltimaModificacao":"2017-07-12T21:05:09.007"}
07-13 00:05:08.754 9935-9956/br.com.alura.agenda D/OkHttp: <-- END HTTP (2221-byte body)
07-13 00:05:08.772 9935-9935/br.com.alura.agenda E/SQLiteLog: (20) statement aborts at 5: [INSERT INTO Alunos(caminhoFoto,nome,nota,id,endereco,site,telefone) VALUES (?,?,?,?,?,?,?)] datatype mismatch
07-13 00:05:08.773 9935-9935/br.com.alura.agenda E/SQLiteDatabase: Error inserting caminhoFoto=null nome=Taiana nota=10.0 id=00bed7d8-6cac-42c5-994b-b4fa8fbabb57 endereco=Belford Roxo site=www.sitedataiana.com.br telefone=888888888
                                                                   android.database.sqlite.SQLiteDatatypeMismatchException: datatype mismatch (code 20)
                                                                       at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
                                                                       at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
                                                                       at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
                                                                       at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
                                                                       at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1474)
                                                                       at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1343)
                                                                       at br.com.alura.agenda.dao.AlunoDao.insere(AlunoDao.java:102)
                                                                       at br.com.alura.agenda.dao.AlunoDao.sincroniza(AlunoDao.java:185)
                                                                       at br.com.alura.agenda.ListaAlunosActivity$3.onResponse(ListaAlunosActivity.java:100)
                                                                       at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70)
                                                                       at android.os.Handler.handleCallback(Handler.java:751)
                                                                       at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                       at android.os.Looper.loop(Looper.java:154)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
07-13 00:05:08.773 9935-9935/br.com.alura.agenda E/SQLiteLog: (20) statement aborts at 5: [INSERT INTO Alunos(caminhoFoto,nome,nota,id,endereco,site,telefone) VALUES (?,?,?,?,?,?,?)] datatype mismatch
07-13 00:05:08.773 9935-9935/br.com.alura.agenda E/SQLiteDatabase: Error inserting caminhoFoto=null nome=Tereza nota=10.0 id=0f6f86e6-1b58-46f8-850f-acf48da6b8ef endereco=Engenho de Dentro site=www.sitedatereza.com.br telefone=999999999
                                                                   android.database.sqlite.SQLiteDatatypeMismatchException: datatype mismatch (code 20)
                                                                       at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
                                                                       at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
                                                                       at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
                                                                       at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
                                                                       at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1474)
                                                                       at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1343)
                                                                       at br.com.alura.agenda.dao.AlunoDao.insere(AlunoDao.java:102)
                                                                       at br.com.alura.agenda.dao.AlunoDao.sincroniza(AlunoDao.java:185)
                                                                       at br.com.alura.agenda.ListaAlunosActivity$3.onResponse(ListaAlunosActivity.java:100)
                                                                       at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70)
                                                                       at android.os.Handler.handleCallback(Handler.java:751)
                                                                       at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                       at android.os.Looper.loop(Looper.java:154)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
07-13 00:05:08.773 9935-9935/br.com.alura.agenda E/SQLiteLog: (20) statement aborts at 5: [INSERT INTO Alunos(caminhoFoto,nome,nota,id,endereco,site,telefone) VALUES (?,?,?,?,?,?,?)] datatype mismatch
07-13 00:05:08.774 9935-9935/br.com.alura.agenda E/SQLiteDatabase: Error inserting caminhoFoto=null nome=safasfa nota=10.0 id=2deb81c9-c8b8-4915-b61d-a3dc89e324b6 endereco=fdasfsd site=sdcasdas telefone=99999999
                                                                   android.database.sqlite.SQLiteDatatypeMismatchException: datatype mismatch (code 20)
                                                                       at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
                                                                       at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
                                                                       at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
                                                                       at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
                                                                       at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1474)
                                                                       at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1343)
                                                                       at br.com.alura.agenda.dao.AlunoDao.insere(AlunoDao.java:102)
                                                                       at br.com.alura.agenda.dao.AlunoDao.sincroniza(AlunoDao.java:185)
                                                                       at br.com.alura.agenda.ListaAlunosActivity$3.onResponse(ListaAlunosActivity.java:100)
                                                                       at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70)
                                                                       at android.os.Handler.handleCallback(Handler.java:751)
                                                                       at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                       at android.os.Looper.loop(Looper.java:154)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

Oi Victor, tudo bem?

Se possível, me envia o seu projeto que eu dou uma olhada e te passo um feedback do motivo de estar acontecendo o problema, pode ser? Pelo erro tudo indica que o problema está no tipo que está sendo enviado para o banco.

Se preferir, também é possível consultar o projeto final para verificar o que está de diferente. Nesta aula tem o link do github do curso.

[]s

Blz. Deixe seu email do google, caso tenha, pois vou disponibilizá-lo mais tarde no google drive e compartilho com você.

De modo geral, tentamos publicar os projetos no github, pois fica mais fácil de baixar ou até mesmo enviar algum ajuste no código.

Mas, de qualquer forma é só mandar, segue o e-mail: alexfelipevieira@gmail.com.

Alex, compartilhei o projeto com você no google drive. Assim que puder confirme se consegue visualizar. Agradeço a atenção!

Oi Victor, blz?

Eu vi o seu projeto e encontrei o problema, no onCreate() do AlunoDAO você deixou o tipo do id como INTEGER sendo que agora é CHAR(36), ou seja, mesmo que seja feita a migration, no momento que for necessário criar o banco novamente, isto é, quando desinstalar e instalar a aplicação, por exemplo, o banco é criado novamente, e por isso acontece o problema. Vou te mandar o trecho do código que ajustei:

Veja se funciona agora:

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

Qualquer dúvida é só avisar.

[]s

Ok Alex. Antes de alterar e testar, neste caso qual a versão do banco que deve estar ativo no código para o teste, pois pelo que lembro existem 3 cases logo abaixo no código, cada um com uma função?

É pra manter a mesma versão que está. No caso você precisa desinstalar a app e instalar novamente.

Basicamente, essa questão de versão é importante quando já temos a app instalada no celular e o banco precisa mudar, por isso que no seu caso você tem o case 3 e a versão está no 4. Caso tivesse uma nova migration, bastaria mudar para a versão 5 que o onUpdate() executaria o case 4.

É também por esse motivo de desinstalar a app que a tabela do onCreate() precisa conter todas as mudanças que foram realizadas dentro da migration, ou seja, se teve uma mudança na migration que reflete a estrutura da tabela, como foi o caso de mudar um tipo, essa mudança precisa sere feita no onCreate() também.

[]s