Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Implementando calendário no Room

Bom dia, Implementei um calendário fazendo uma simulação em meu projeto, estou utilizando o MaterialDatePicker para utilizar em meu formulário, quero implementar em meu Room só que eu estava dando uma olhada e eu acho que preciso converter para o tipo String em meu AppDataBase, é possível fazer essa modificação ou preciso utilizar uma outra técnica queria uma ajuda nessa questão para fazer o converter para salvar esses dados no meu projeto,

Meu AppDataBase

package com.aifarmtech.orgs.database

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import androidx.room.TypeConverters
import com.aifarmtech.orgs.database.Converters.Converters
import com.aifarmtech.orgs.database.Converters.ConvertersCalendario
import com.aifarmtech.orgs.database.dao.ProdutoCalendarioDao
import com.aifarmtech.orgs.database.dao.ProdutoDao
import com.aifarmtech.orgs.database.dao.UsuarioDao
import com.aifarmtech.orgs.model.Produto
import com.aifarmtech.orgs.model.ProdutoDia
import com.aifarmtech.orgs.model.Usuario

@TypeConverters(Converters::class, ConvertersCalendario::class)
@Database(
    entities = [Produto::class,
        Usuario::class,
        ProdutoDia::class],
    version = 4,
    exportSchema = true
)
abstract class AppDataBase : RoomDatabase() {
    abstract fun ProdutoDao(): ProdutoDao
    abstract fun UsuarioDao(): UsuarioDao
    abstract fun ProdutoCalendarioDao(): ProdutoCalendarioDao

    companion object {
        @Volatile
        private var db: AppDataBase? = null
        fun instancia(context: Context): AppDataBase {
            return db ?: Room.databaseBuilder(
                context,
                AppDataBase::class.java,
                "orgs.db"
            ).allowMainThreadQueries().addMigrations(
                MIGRATION_1_2,
                MIGRATION_2_3,
                MIGRATION_3_4
            )
                .build()
                .also {
                    db = it
                }
        }
    }
}

Meu ProdutoDia :

package com.aifarmtech.orgs.model

import android.os.Parcelable
import androidx.room.Entity
import androidx.room.PrimaryKey
import kotlinx.parcelize.Parcelize
import java.time.LocalDate

@Entity
@Parcelize
data class ProdutoDia(
    @PrimaryKey val id: String,
    val dia: String,
    val semana: String,
    val calendario: LocalDate = LocalDate.now()
) : Parcelable

Nessa questão na minha varíavel do calendário é o LocalDate, em meu calendario deveria fazer alguma modificação aqui? ou fazer o Converters no AppDataBase

meu ProdutoDiaDao

package com.aifarmtech.orgs.database.dao

import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query
import com.aifarmtech.orgs.model.ProdutoDia

@Dao
interface ProdutoCalendarioDao {

    @Query("SELECT * FROM ProdutoDia")
    fun buscarTodos() : List<ProdutoDia>

    @Insert
    fun salvar(vararg produtoDia: ProdutoDia)
}

Queria em uma ajuda nessa parte dei uma olhada na documenção mais é um pouco diferente não fazer os converters tentei usar o Chat-GPT 3.5 Turbo, mais também não consegui achar, e quando eu aperto no martelo(Make, build) aparece o seguinte erro !!

private final java.time.LocalDate calendario = null;

eu acho que deveria fazer o converter por que o SQL não tem suporte com essa variável do meu ProdutoDia, e muito Obrigado por me ajudar!

Projeto que utilizei como simulação do Alex Felipe!!

Link do Projeto do Alex

Referenciar dados complexos usando o Room

Obrigado!

2 respostas
solução!

Olá, Felipe. Tudo bem?

Pelo que entendi, você está tentando salvar um objeto do tipo LocalDate no seu banco de dados Room, mas está encontrando dificuldades porque o Room não suporta esse tipo diretamente. A solução para isso é usar um conversor (TypeConverter) para transformar o LocalDate em um tipo que o Room possa lidar.

No seu caso, você pode converter o LocalDate para um tipo Long que representa a data em milissegundos desde a época (1970-01-01T00:00:00Z). Aqui está um exemplo de como você pode fazer isso:

import androidx.room.TypeConverter
import java.time.Instant
import java.time.LocalDate
import java.time.ZoneId

class ConvertersCalendario {

    @TypeConverter
    fun fromTimestamp(value: Long?): LocalDate? {
        return value?.let {
            Instant.ofEpochMilli(it).atZone(ZoneId.systemDefault()).toLocalDate()
        }
    }

    @TypeConverter
    fun dateToTimestamp(date: LocalDate?): Long? {
        return date?.atStartOfDay(ZoneId.systemDefault())?.toInstant()?.toEpochMilli()
    }
}

Neste exemplo, o método fromTimestamp converte um valor Long em LocalDate, e o método dateToTimestamp faz o contrário. Você pode usar esses métodos para informar ao Room como converter entre LocalDate e Long.

Depois de definir o conversor, você precisa informar ao Room para usá-lo. Você já fez isso em seu código com a anotação @TypeConverters em sua classe de banco de dados. Certifique-se de que a classe ConvertersCalendario está incluída na lista de conversores.

Espero que isso resolva seu problema. Se você ainda estiver com dificuldades, por favor, forneça mais detalhes sobre o erro que está encontrando.

Muito obrigado.