Meu aplicativo está usando atualmente retrofit e Room, mas estou com dificuldades para encontrar uma maneira de gerar automaticamente o id do objeto Db. Ao mapear o objeto retrofit para a entidade RoomDb, ele continua pedindo um id para arquivar, mesmo se eu tiver adicionado a chave de geração automática
Abaixo está o objeto de retrofit:
data class RetrofitProduct(
@SerializedName("id")
val id: String,
@SerializedName("types")
val types: List<String>,
@SerializedName("date")
val date: String,
)
e a Entidade de Sala associada:
@Entity
data class ProductEntity(
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
val id: Int,
@ColumnInfo(name = "productId")
val productId: String,
@ColumnInfo(name = "types")
val types: List<String>,
)
o Mapper é como abaixo:
fun RetrofitProduct.toEntity(): ProductEntity {
return ProductEntity(
productId = this.id,
types = this.types,
)
}
Mas no momento da compilação, o compilador reclama que preciso adicionar id
:
Nenhum valor passado para o parâmetro 'id'
Quero que esse ID seja gerado pelo Room como uma forma de obter o número de itens para minha paginação.
Basicamente, se eu puxar o lastItem, sei que o id é, por exemplo: 25. Então, preciso pedir 26 ou mais.
Na verdade, esse é um problema bem comum ao trabalhar com Room e IDs gerados automaticamente. O problema é que, mesmo que você tenha marcado o ID como autoGenerate = true, o Kotlin ainda exige que todos os parâmetros sejam fornecidos no construtor, já que ProductEntity é uma classe de dados. Aqui estão algumas maneiras de resolver isso:
A solução mais rápida é fornecer um valor padrão de 0:
Ou se você preferir ser mais explícito em seu mapeador:
Room ignorará o valor 0 e gerará automaticamente um novo ID quando você inserir a entidade. Isso funciona porque o Room verifica se há 0 ou nulo (dependendo se você está usando tipos anuláveis) como sinais para gerar automaticamente o ID. Quando você usa essa abordagem para paginação, ainda pode consultar o ID do último item sem problemas, pois o Room terá substituído esse 0 pelo valor real gerado automaticamente.