2
respostas

[Dúvida] Lindando com Relacionamentos com o Room

Estou tendo uma problema para relacionar meu dados do Room estou lidando com relacionamentos repetidos em outras recycler, um exemplo em meu projeto adicionei uma RecyclerView chamada Produto, na RecyclerView Produto dentro do Produto adicionei outra chamada PlantacaoCebola, agora eu precisava filtrar essas recycler para cada uma pertencer a sua lista e dentro da lista eu conseguir adionar mais listas, lidando com relacionamento igual ao Usuario ao fazer login, como eu poderia resolver esse problema adicionando um recycler dentro de um recycler filtrando e relacionando essas listas, um para todos:

Link do meu Projeto: https://github.com/NewHolland2/AgrissLine

Produto

package com.aifarmtech.orgs.model

import android.os.Parcelable
import androidx.room.Entity
import androidx.room.PrimaryKey
import kotlinx.parcelize.Parcelize
import java.math.BigDecimal

@Entity
@Parcelize
data class Produto(
    @PrimaryKey(autoGenerate = true)
    val id: Long = 0L,
    val nome: String,
    val cpf: String,
    val numerotelefone: String,
    val email: String,
    val descricao: String,
    val valor: BigDecimal,
    val imagem: String? = null,
    val usuarioId: String? = null
) : Parcelable {
    fun salvoSemUsuario() = usuarioId.isNullOrBlank() &&
            id > 0L
}

PlantacaoCebola

package com.aifarmtech.orgs.model

import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.ForeignKey
import androidx.room.PrimaryKey

@Entity(tableName = "plantacao_cebola")
data class PlantacaoCebola(
    @PrimaryKey(autoGenerate = true)
    val id: Long = 0L,
    val comprimentoLinha: Int,
    val plantasPorMetro: Int,
    val custoPorMilPlantas: Double,
    val data: Long, // Adicionando a propriedade de data
    val hora: Long, // Adicionando a propriedade de hora
    @ColumnInfo(name = "produto_id")
    val produtoId: Long
)

Eu presisava de umas dicas de como fazer a lógica e trabalhar com os relacionamentos em meu recyclerView

2 respostas

Bom dia!

Vou tentar fornecer algumas orientações para resolver esse problema.

  1. Relacionamento entre entidades no Room: Para representar um relacionamento entre as entidades Produto e PlantacaoCebola, você já está usando a chave estrangeira produtoId na entidade PlantacaoCebola. Isso é um bom começo.

  2. Consulta de dados: Para exibir os dados relacionados em seu RecyclerView aninhado, você precisará de uma consulta SQL adequada que retorne os produtos junto com suas plantações de cebola correspondentes. Isso geralmente é feito com uma JOIN query no Room. Por exemplo:

    @Query("SELECT * FROM Produto INNER JOIN plantacao_cebola ON Produto.id = plantacao_cebola.produto_id WHERE Produto.id = :produtoId")
    suspend fun getProdutoComPlantacoes(produtoId: Long): ProdutoComPlantacoes
    

    Aqui ProdutoComPlantacoes é um modelo de dados que combina os dados do Produto com as PlantacoesCebola.

  3. Adapter para RecyclerViews aninhadas: Você precisará de um adapter personalizado para sua RecyclerView aninhada. Este adapter será responsável por exibir os dados da lista de plantações de cebola para cada produto. Você pode criar um adapter semelhante ao que você tem para a RecyclerView de Produto.

  4. Lógica na Activity/Fragments: Na sua Activity ou Fragment que contém as RecyclerViews, você precisará recuperar os dados dos produtos junto com suas plantações de cebola correspondentes e, em seguida, configurar os adapters apropriados para cada RecyclerView.

  5. Exibição na UI: Finalmente, você precisará ajustar sua interface do usuário para exibir corretamente as RecyclerViews aninhadas. Isso pode envolver a criação de layouts XML adequados e a configuração das RecyclerViews nos respectivos layouts.

Lembra de testar sua implementação cuidadosamente para garantir que os dados estejam sendo exibidos corretamente e que não haja problemas de desempenho, especialmente se você estiver lidando com grandes conjuntos de dados.

Abs!

Bom dia.

Sim vou tentar, obrigado por me ajudar.

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