Room Database is a part of the Android Architecture components which provides an abstraction layer over SQLite which allows for more robust database access while still providing the full power of SQLite.
You're converting from Date to Long (wrapper) and from long (primitive) to Date. I changed it to Long and it compiled. Besides, unboxing null in your converter produces a 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();
}
}
See my complete example.
Refer to the 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();
}
}
Then map it to the database.
@Database(entities = {User.class}, version = 1)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
And the entity.
@Entity
public class User {
private Date birthday;
}
I had this same problem (how to store time to Room), but I was using Calendar
, so I made this:
[note: This anwer is for Calendar ; the main reason is that Calendar is now supported]
edit: the main reason for this answer is that Date
is deprecated, so here you go
@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();
}
Put converter class in class of data base, not in the model :
@Database(entities = {
Patient.class,Medicine.class,Tooth.class,})
@TypeConverters({TimeConverter.class,OutBoundConverter.class})
public abstract class PatientDataBase extends RoomDatabase {//your data base}
AndroidThreeTen is the port of Java8 new time classes, which unfortunately are available only for api>=26. Using https://github.com/JakeWharton/ThreeTenABP , we can use LocalDateTime on all versions of Android. Here in kotlin the converter,
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()
}
}
which, as other good answers already said, it's declared on the Database abstract class:
@Database(entities = {User.class}, version = 1)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With