Sutirth
Estoy usando la clase de convertidor de fecha para convertir mi objeto de fecha. Sin embargo, todavía encuentro un error que dice. error: No se puede averiguar cómo guardar este campo en una base de datos. Puede considerar agregar un convertidor de tipos para ello.
Mi clase de convertidor de fecha
public class DateConverter {
@TypeConverter
public static Date toDate(Long dateLong){
return dateLong == null ? null: new Date(dateLong);
}
@TypeConverter
public static long fromDate(Date date){
return date == null ? null :date.getTime();
}
}
Mi tabla de base de datos para usar el objeto de fecha.
@Entity(tableName = "userFitnessDailyRecords")
@TypeConverters(DateConverter.class)
public class UserFitnessDailyRecords {
@NonNull
@PrimaryKey(autoGenerate = true)
public int id;
public Date forDay;
public Date getForDay() {
return forDay;
}
public void setForDay(Date forDay) {
this.forDay = forDay;
}
}
Seguí el ejemplo de los laboratorios de persistencia de código de Google y del ejemplo respectivo de GitHub de la sala de commonwares. Estoy usando la versión de sala 1.0.0.
Estás convirtiendo de Fecha a Largo (envoltura) y de largo (primitivo) hasta la fecha. Lo cambié a Long y se compiló. Además, desempaquetar nulo en su convertidor produce un NPE.
public class DateConverter {
@TypeConverter
public static Date toDate(Long dateLong){
return dateLong == null ? null: new Date(dateLong);
}
@TypeConverter
public static Long fromDate(Date date){
return date == null ? null : date.getTime();
}
}
Ver mi ejemplo completo.
Consulte la documentación: https://developer.android.com/training/data-storage/room/referencing-data
public class Converters {
@TypeConverter
public static Date fromTimestamp(Long value) {
return value == null ? null : new Date(value);
}
@TypeConverter
public static Long dateToTimestamp(Date date) {
return date == null ? null : date.getTime();
}
}
Luego mapéelo a la base de datos.
@Database(entities = {User.class}, version = 1)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
Y la entidad.
@Entity
public class User {
private Date birthday;
}
-
¡Gracias! Contiene un ejemplo de uso. Debe ser aceptado.
– CoolMind
10 de marzo de 2021 a las 8:10
-
si hacemos el elemento interno como una lista, ¿cómo lo hacemos? stackoverflow.com/questions/70815892/…
– usuario17115124
23 de enero a las 10:09
O-9
Tuve este mismo problema (cómo almacenar el tiempo en la habitación), pero estaba usando Calendar
así que hice esto:
[note: This anwer is for Calendar ; the main reason is that Calendar is now supported]
editar: la razón principal de esta respuesta es que Date
está en desuso, así que aquí tienes
@TypeConverter
public static Calendar toCalendar(Long l) {
Calendar c = Calendar.getInstance();
c.setTimeInMillis(l);
return c;
}
@TypeConverter
public static Long fromCalendar(Calendar c){
return c == null ? null : c.getTime().getTime();
}
Date
Convertidor de tipo para kotlin:
class Converters {
@TypeConverter
fun fromTimestamp(value: Long?): Date? {
return value?.let { Date(it) }
}
@TypeConverter
fun dateToTimestamp(date: Date?): Long? {
return date?.time?.toLong()
}
}
y aquí está cómo adjuntarlo a su base de datos:
@Database(entities = [User::class], version = 1)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
Copiado de documentos oficiales
hassan halak
Ponga la clase de convertidor en la clase de la base de datos, no en el modelo:
@Database(entities = {
Patient.class,Medicine.class,Tooth.class,})
@TypeConverters({TimeConverter.class,OutBoundConverter.class})
public abstract class PatientDataBase extends RoomDatabase {//your data base}
Namitha Reval
Si no quiere lidiar con Autoboxing y Unboxing, simplemente use la primitiva largo tipo de datos de la siguiente manera:
public class DateConverter {
@TypeConverter
public static Date toDate(long date) {
return new Date(date);
}
@TypeConverter
public static long fromDate(Date date) {
return date == null ? Calendar.getInstance().getTimeInMillis() : date.getTime();
}
}
Tenga en cuenta que esto predeterminará la fecha a la fecha actual.
andresbloom
AndroidThreeTen es el puerto de las nuevas clases de tiempo de Java8, que lamentablemente solo están disponibles para api>=26. Usando https://github.com/JakeWharton/ThreeTenABP , podemos usar LocalDateTime en todas las versiones de Android. Aquí en kotlin el convertidor,
class Converters {
@TypeConverter
fun fromTimestamp(value: Long?): LocalDateTime? {
return value?.let {
LocalDateTime.ofInstant(
Instant.ofEpochMilli(it), ZoneId.systemDefault()
)
}
}
@TypeConverter
fun LocalDateTimeToTimestamp(date: LocalDateTime?): Long? {
return date?.atZone(ZoneId.systemDefault())?.toInstant()?.toEpochMilli()
}
}
que, como ya dijeron otras buenas respuestas, se declara en la clase abstracta de la base de datos:
@Database(entities = {User.class}, version = 1)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
Para mí, la mejor manera es usar Gson() para convertirlo en cadena y viceversa. Puede usar cualquier tipo de objeto con la conversión de Gson.
– abdul rehman
20 mayo 2020 a las 17:41