Комната с использованием поля даты

Я использую класс преобразователя даты для преобразования объекта даты. Однако я все еще получаю сообщение об ошибке. ошибка: не могу понять, как сохранить это поле в базе данных. Вы можете рассмотреть возможность добавления для него преобразователя типов.

Класс 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();
    }
}

Таблица "Моя база данных" для использования объекта даты.

@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;
        }
    }

Я последовал примеру лаборатории сохранения кода Google и соответствующему примеру GitHub из комнаты общего программного обеспечения. Я использую версию 1.0.0.


person Sutirth    schedule 13.05.2018    source источник
comment
Для меня лучший способ - использовать Gson (), чтобы преобразовать его в строку и наоборот. Вы можете использовать любой тип объекта с преобразованием Gson.   -  person abdul rehman    schedule 20.05.2020


Ответы (8)


Вы преобразуете Date в Long (оболочка) и из long (примитив) в Date. Я изменил его на Long, и он скомпилирован. Кроме того, распаковка нуля в вашем конвертере дает 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();
    }
}
person Community    schedule 13.05.2018

См. Мой полный пример.

См. Документацию: 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();
    }
}

Затем сопоставьте его с базой данных.

@Database(entities = {User.class}, version = 1)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

И сущность.

@Entity
public class User {
    private Date birthday;
}
person Zhar    schedule 06.10.2019
comment
Спасибо! Содержит пример использования. Следует принять. - person CoolMind; 10.03.2021

Поместите класс конвертера в класс базы данных, а не в модель:

@Database(entities = {
    Patient.class,Medicine.class,Tooth.class,})

@TypeConverters({TimeConverter.class,OutBoundConverter.class})

public abstract class PatientDataBase extends RoomDatabase {//your data base}
person Hassan Hallak    schedule 17.03.2019

У меня была такая же проблема (как сохранить время в комнате), но я использовал Calendar, поэтому я сделал следующее: [примечание: этот ответ предназначен для Календаря; основная причина в том, что теперь поддерживается Календарь]

изменить: основная причина этого ответа заключается в том, что Date устарел, так что вперед

  @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();
  }
person O-9    schedule 09.05.2019

Использование Calendar с Kotlin (адаптировано из ответа 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
person Ollie    schedule 31.08.2019

Вы также можете написать это на Котлине

@TypeConverter
fun toDate(dateLong:Long):Date {
    return Date(dateLong)
}

@TypeConverter
fun fromDate(date: Date):Long{
    return date.time;
}
person Potehin Ruslan    schedule 20.11.2019

AndroidThreeTen - это порт новых классов времени Java8, которые, к сожалению, доступны только для api> = 26. Используя https://github.com/JakeWharton/ThreeTenABP, мы можем использовать LocalDateTime на всех версиях Android. . Вот в котлине конвертер,

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()
    }
}

который, как уже говорилось в других хороших ответах, объявлен в абстрактном классе базы данных:

@Database(entities = {User.class}, version = 1)
@TypeConverters({Converters.class})
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}
person AndrewBloom    schedule 12.03.2020

Если вы не хотите иметь дело с Autoboxing и Unboxing, просто используйте примитивный тип данных long, как показано ниже:

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();
  }
}

Обратите внимание, что по умолчанию будет установлена ​​текущая дата.

person Namitha Reval    schedule 04.11.2020