3
respostas

Erro de compilação ao realizar a migration

Olá gente, boa tarde!

Estou tendo o um problema ao realizar a migration, está dando erro de compilação quando eu rodo o app no meu celular dizendo que nao conseguiu achar a chave estrageira na tabela telefone, sendo que eu criei, se poderem me ajudar, por favor!

O erro é esse:

Erro

O código da migration é:

new Migration(5, 6) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            database.execSQL("CREATE TABLE IF NOT EXISTS " + newStudentDatabaseName + " (`identifier` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `email` TEXT, `createDate` INTEGER)");
            database.execSQL("INSERT INTO " + newStudentDatabaseName + " (identifier, name, email) SELECT identifier, name, email FROM " + studentDatabaseName);
            database.execSQL("CREATE TABLE IF NOT EXISTS " + telephoneDatabaseName + " (`identifier` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `number` TEXT, `telephoneType` TEXT, `studentIdentifier` INTEGER NOT NULL)");
            database.execSQL("INSERT INTO " + telephoneDatabaseName + " (number, studentIdentifier) SELECT telephone, identifier FROM " + studentDatabaseName);
            database.execSQL("UPDATE " + telephoneDatabaseName + " SET telephoneType = ?", new TelephoneType[]{TelephoneType.LANDLINE});
            removeAndRename(database);
        }
    }

O código do model Telephone:

@Entity
public class Telephone implements Parcelable {
    @PrimaryKey(autoGenerate = true)
    private int identifier;
    private String number;
    private TelephoneType telephoneType;
    @ForeignKey(
            entity = Student.class,
            parentColumns = "identifier",
            childColumns = "studentIdentifier",
            onUpdate = CASCADE,
            onDelete = CASCADE
    )
    @ColumnInfo(index = true)
    private int studentIdentifier;
    
    ...

O meu dispositivo é um com o android 12 e a versão do Room é a mesma da aula!

3 respostas

Olá, Camilla! Boa tarde!

Entendo que você esteja enfrentando um problema ao realizar a migration no seu projeto Android Room. Pelo erro apresentado, parece que o Room não está conseguindo encontrar a chave estrangeira na tabela de telefone.

Ao analisar o código da sua migration e do modelo Telephone, parece que você está definindo corretamente a relação de chave estrangeira com a entidade Student. No entanto, pode haver um problema na forma como você está realizando a inserção de dados na tabela de telefones durante a migration.

Verifique se a tabela de estudantes (studentDatabaseName) já possui registros antes da migration. Caso contrário, a inserção de telefones na tabela de telefones (telephoneDatabaseName) pode estar sendo feita com valores nulos para o campo studentIdentifier, o que causaria o erro de compilação.

Uma possível solução seria verificar se a tabela de estudantes possui registros antes de realizar a inserção na tabela de telefones. Você pode fazer isso adicionando uma cláusula WHERE na consulta SQL da inserção, como no exemplo abaixo:

database.execSQL("INSERT INTO " + telephoneDatabaseName + " (number, studentIdentifier) SELECT telephone, identifier FROM " + studentDatabaseName + " WHERE identifier IS NOT NULL");

Dessa forma, apenas os registros da tabela de estudantes que possuem um valor não nulo para o campo identifier serão inseridos na tabela de telefones.

Lembre-se de adaptar o código de acordo com a estrutura do seu banco de dados e as necessidades do seu projeto.

Espero que essa sugestão possa te ajudar a resolver o problema de compilação na migration. Se tiver mais alguma dúvida, é só perguntar!

Espero ter ajudado e bons estudos!

Oi! Tudo bem?

Obrigado pela resposta! Ela realmente faz sentido e testei aqui, porém, infelizmente, ela acusa o mesmo erro :(

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Olá! Acredito que descobri o motivo, o Room está fazendo essa migration em um dispositivo que nunca fez a instalação do app, logo seria desnecessário ele fazer isso, estou investigando o motivo por trás disso.

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