3
respostas

Banco não atualiza

Troquei a versão do banco para 4 no construtor, inseri o case 3, fiz todas as atualizações para migrar e inserir UUID nos alunos, mas a aplicação nem entrava nesse case. Tive que reinstalar a aplicação, e aí fiquei sem saber se a migração funcionou ou não. Segue o código do construtor e do onUpgrade:

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

    @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);

            case 2:
                String criarNovaTabela = "CREATE TABLE Alunos_nova " +
                        "(id CHAR(36) PRIMARY KEY," +
                        "nome TEXT NOT NULL, " +
                        "endereco TEXT, " +
                        "telefone TEXT, " +
                        "site TEXT, " +
                        "nota REAL, " +
                        "caminhoFoto TEXT);";

                db.execSQL(criarNovaTabela);

                String inserirAlunosNaNovaTabela = "INSERT INTO Alunos_nova (id, nome, endereco, telefone, site, nota, caminhoFoto) " +
                        "SELECT id, nome, endereco, telefone, site, nota, caminhoFoto " +
                        "FROM Alunos";
                db.execSQL(inserirAlunosNaNovaTabela);

                String removerTabelaAntiga = "DROP TABLE Alunos";
                db.execSQL(removerTabelaAntiga);

                String alterarNomeDaNovaTabela = "ALTER TABLE Alunos_nova " +
                        "RENAME TO Alunos";
                db.execSQL(alterarNomeDaNovaTabela);

            case 3:
                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) {
                    String novouuid = geraUUID();
                    Log.i("UUID gerado ", novouuid);
                    db.rawQuery(atualizaIdDoAluno, new String[]{novouuid, aluno.getId()});
                }

        }
    }

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

Oi Laura, tudo bem? Pode enviar o código do método onCreate() também? Lembrando que ele é importante principalmente quando acontece os processos que apagam os dados da App como foi o caso seu caso. Em outras palavras, a última modificação que fez na estrutura do banco precisa ser feita no Script que cria o banco de dados, no caso do onCreate().

To bem, e você? Até o final da aula 4 não mexemos nesse método, então ele ainda está assim:

@Override
    public void onCreate(SQLiteDatabase db) { 
        Log.i("entrou no create do bd", null);
        Log.d(null,"entrou no create");
        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);
    }

Oi Laura, tudo também! :)

Repara que a tabela ainda está com o tipo INTEGER para a coluna id. Em outras palavras, já que você fez o processo no qual o onCreate() é executado, essa tabela precisa ser atualizada também, portanto, deixe-a com o tipo CHAR(36).

Após a modificação, desinstale app ou apague os dados da mesma e veja se funciona, por favor?

Sobre o motivo de não ter executado o case eu não sei dizer, pois o código aparentemente tá correto, não consigo visualizar algum problema...

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