Room Using Date field

43,098

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.

Share:
43,098
Sutirth
Author by

Sutirth

Updated on December 27, 2021

Comments

  • Sutirth
    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
    CoolMind over 3 years
    Thanks! Contains an example of using. Should be accepted.
  • Admin
    Admin over 2 years
    if we make the inner element as a list how do we do it? stackoverflow.com/questions/70815892/…