Room Using Date field
Solution 1
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;
}
Solution 2
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();
}
Solution 3
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}
Solution 4
Date
TypeConverter for Kotlin:
class Converters {
@TypeConverter
fun fromTimestamp(value: Long?): Date? {
return value?.let { Date(it) }
}
@TypeConverter
fun dateToTimestamp(date: Date?): Long? {
return date?.time?.toLong()
}
}
and here is how to attach it to your database:
@Database(entities = [User::class], version = 1)
@TypeConverters(Converters::class)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
Copied from official docs
Solution 5
If you don't want to deal with Autoboxing and Unboxing, just use the primitive long data type as below:
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();
}
}
Note that this will default the date to current date.
Sutirth
Updated on December 27, 2021Comments
-
Sutirth over 2 years
I am using date converter class to convert my date object. However, I still encounter an error saying. error: Cannot figure out how to save this field into a database. You can consider adding a type converter for it.
My Date Converter class
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(); } }
My Database table for using the date object.
@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; } }
I followed the example from google code persistence labs and from commonwares room respective GitHub example. I am using room version 1.0.0.
-
CoolMind over 3 yearsThanks! Contains an example of using. Should be accepted.
-
Admin over 2 yearsif we make the inner element as a list how do we do it? stackoverflow.com/questions/70815892/…