如何在返回列表的同时将日期从数据库转换为格式化的字符串

时间:2019-04-15 21:21:51

标签: android sqlite string-formatting android-room java-date

在列表中返回日期时,是否可以格式化数据库中的日期?我目前有一个包含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>

得分报告:

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

当我访问数据库以将Date作为文本返回列表中时,它以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 个答案:

答案 0 :(得分:1)

为此,您需要使用Chris Banes在this post中所述的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对象,并且所有   克里斯帖子中要做的必要步骤

答案 1 :(得分:0)

您可能需要解释模式,并提供类似于以下硬编码的格式字符串,但这应该可以让您了解正确的语法。

尝试将其更改为此:

@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