Habitación con campo de fecha

4 minutos de lectura

Avatar de usuario de Sutirth
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.

  • 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

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

Avatar de usuario de O-9
O-9

Tuve este mismo problema (cómo almacenar el tiempo en la habitación), pero estaba usando Calendarasí 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

Avatar de usuario de Hassan Hallak
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}

Avatar de usuario de Namitha Reval
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.

Avatar de usuario de AndrewBloom
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();
}

¿Ha sido útil esta solución?