Android Комната: Преобразователь типов для String Date to Long? - PullRequest
0 голосов
/ 28 мая 2020

Я храню свои даты в базе данных в виде строк. Это нормально работало при использовании MySQL, однако, используя комнату в android, я не могу выполнять поиск по дате до и дате от в моих запросах правильно, поскольку комната не распознает строковые даты. Мне интересно, можно ли использовать преобразователь типов, чтобы просто преобразовать строку в длинную. Вместо того, чтобы переделывать всю мою базу данных для хранения даты вместо строки, а затем конвертировать из Date в long.

Любая помощь с этим будет принята с благодарностью. 1006 *

  @TypeConverter
  public static Date fromTimestamp(String value) {
  if (value != null) {
    try {
        return df.parse(value);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return null;
} else {
    return null;
}

ЗАПРОС

 // Get Monthly Logs
 @Query("SELECT checkInTable.checkInId, checkInTable.moodBeforeId, " +
    "checkInTable.checkInEntry, checkInTable.checkInEntry2, " +
    "checkInTable.userId, moodBeforeTable.workoutDate,   
     moodBeforeTable.moodBefore, " +
    "moodBeforeTable.moodBeforePK " +
    "FROM checkInTable " +
    "JOIN moodBeforeTable " +
    "ON checkInTable.moodBeforePK = moodBeforeTable.moodBeforePK " +
    "WHERE moodBeforetable.workoutDate >= datetime('now', '-1 month') " +
    "ORDER BY moodBeforeTable.workoutDate DESC")
     LiveData<List<CheckInLogsPojo>> getCheckInLogsMonthly();

МОДЕЛЬ

 @NonNull
 @ColumnInfo(name = "workoutDate")
 @TypeConverters({TimeTypeConverter.class})
 private String workoutDate;

ОБНОВЛЕНИЕ: с указанным выше преобразователем типов и запросом он по-прежнему не сортирует результаты в течение 1 месяца. Он просто показывает все.

1 Ответ

1 голос
/ 28 мая 2020

Без повтора всей базы данных. Это можно сделать с помощью миграции базы данных.

Используя преобразователь типа, дата может быть сохранена в базе данных.

Добавить класс для преобразования даты в long

public class DateConverter {
    @TypeConverter
    public static Date toDate(Long timestamp){
        return timestamp == null ? null : new Date(timestamp);
    }

    @TypeConverter
    public static Long toTimestamp(Date date){
        return date == null ? null : date.getTime();
    }
}

Теперь мы скажем в комнату, чтобы использовать DateConvertor, который мы добавили с помощью аннотации TypeConverts

@Database(entities = {MyEntity.class},version = 1,exportSchema = false)
@TypeConverters(DateConverter.class)
public abstract class MyDatabase extends RoomDatabase {
    //room database
}

Теперь мы можем использовать Date как тип данных в классе сущности

...