J'utilise la classe de convertisseur de date pour convertir mon objet de date. Cependant, je rencontre toujours une erreur disant. erreur: impossible de comprendre comment enregistrer ce champ dans une base de données. Vous pouvez envisager d'ajouter un convertisseur de type pour cela.
classe My Date Converter
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();
}
}
Ma table de base de données pour utiliser l'objet date.
@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;
}
}
J'ai suivi l'exemple des laboratoires de persistance du code Google et de l'exemple GitHub de la salle des commonwares. J'utilise la version de salle 1.0.0.
Vous convertissez de Date en Long (wrapper) et de long (primitive) en Date. Je l'ai changé en Long et il a compilé. De plus, unboxing null dans votre convertisseur produit 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();
}
}
J'ai eu ce même problème (comment stocker du temps dans la salle), mais j'utilisais Calendar
, alors j'ai fait ceci: [note: Cette réponse est pour Calendrier ]
@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();
}
Mettez la classe du convertisseur dans la classe de la base de données, pas dans le modèle:
@Database(entities = {
Patient.class,Medicine.class,Tooth.class,})
@TypeConverters({TimeConverter.class,OutBoundConverter.class})
public abstract class PatientDataBase extends RoomDatabase {//your data base}
Voir mon exemple complet.
Reportez-vous à la documentation: 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();
}
}
Ensuite, mappez-le à la base de données.
@Database(entities = {User.class}, version = 1)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
Et l'entité.
@Entity
public class User {
private Date birthday;
}
Utilisation de Calendar
avec Kotlin (adapté de la réponse d'O95):
@TypeConverter
fun toCalendar(l: Long?): Calendar? =
if (l == null) null else Calendar.getInstance().apply { timeInMillis = l }
@TypeConverter
fun fromCalendar(c: Calendar?): Long? = c?.time?.time