Как преобразовать дату из базы данных в форматированную строку при возврате списка - PullRequest
0 голосов
/ 16 апреля 2019

Есть ли способ отформатировать дату в базе данных, когда она возвращается в списке?В настоящее время у меня есть база данных, которая содержит EntityScore.Это включает в себя дату.Когда я запрашиваю базу данных, чтобы вернуть определенный список, я хочу получить дату в виде отформатированной строки.

Доступ к базе данных:

val list: ArrayList<List<ScoresReport>> = arrayListOf()

for(i in 0 until listHeadings.size)
    list.add(databasePersons.daoScores().getScoresDayPI(listHeadings[i].ID))

daoScores:

@Query("SELECT date as text, AVG(score) as score FROM ScoresTable WHERE personID =:personID")
    fun getScoresDayPI(personID: Int) : List<ScoresReport>

ScoresReport:

class ScoresReport(var text: String, var score: Int)
{}

Когда я получаю доступ к базе данных, чтобы вернуть дату в виде текста в списке, она отображается в миллисекундах с 1970 года.Я хочу, чтобы Дата форматировалась как текст, но в шаблоне, который может меняться в зависимости от настроек пользователя.Например, пользователь может выбрать, по какому шаблону должна отображаться его дата.

Это то, что я хочу:

@Query("SELECT date as SimpleDateFormat(pattern).format(date) -> text, AVG(score) as score FROM ScoresTable WHERE personID =:personID")
    fun getScoresDayPI(personID: Int) : List<ScoresReport>

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Для этого вам нужно использовать TypeConverter, как описано в этом посте Криса Бейнса (я только что преобразовал его в Kotlin)

object DateConverter {
    @TypeConverter
    @JvmStatic
    fun fromMillisToDate(millis: Long?): Date? {
        return millis?.let {
            return Date(millis)
        }
    }

    @TypeConverter
    @JvmStatic
    fun fromDateToMillis(date: Date?): Long? {
        return date?.time
    }
}

И затем вам нужно зарегистрировать это в своем экземпляре базы данных Room, используя аннотацию TypeConverters, чтобы применить его ко всем вашим Date объектам в базе данных.

@Database(
    entities = [
        User::class,
        Todo::class,
    ],
    version = 1
)
@TypeConverters(value = [DateConverter::class])
abstract class AppDatabase : RoomDatabase() {

    abstract fun userDao(): UserDao

    abstract fun todoDao(): TodoDao
}

Помните, что использование Date для хранения дат или отметки времени - это плохо практиковаться, если вам нужно учитывать часовые пояса. Если вы в этом случае лучше, если вы используете OffsetDateTime объекты и есть все необходимый шаг сделать в посте Криса

0 голосов
/ 16 апреля 2019

Возможно, вам придется интерпретировать шаблон и придумать строку формата, аналогичную жестко закодированной ниже, но это должно дать вам представление о правильном синтаксисе.

Попробуйте изменить это на:

@Query("SELECT strftime('%d-%m-%Y %H:%M:%S', date) as scoredate, AVG(score) as score FROM ScoresTable 
WHERE personID =:personID")

Или попробуйте:

@Query("SELECT strftime('%d-%m-%Y %H:%M:%S', date, unixepoch) as scoredate, AVG(score) as score FROM ScoresTable 
WHERE personID =:personID")

https://www.sqlite.org/lang_datefunc.html

...