Android 房间获取今天插入的所有时间

Android Room get all times of todays insert

我正在尝试在用户启动特定 activity 和结束时保存数据,我想计算用户在这个 day/week/month

上花费了多少小时

我在提取此信息时遇到问题。

这是我的 table:

    @Entity(tableName = "daily_activity_time_table")
     data class TimeTrack(


        @PrimaryKey(autoGenerate = true)
        var activityId: Long = 0L,

        @ColumnInfo(name = "start_time")     
        val startTimeMilli: Date = Date(System.currentTimeMillis()),  //i didnt find a better way to save date and time

        @ColumnInfo(name = "end_time")
        var endTimeMilli: Date = startTimeMilli,

        @ColumnInfo(name = "quality_rating")
        var sleepQuality: Int = -1
)

我需要一个查询来获取今天的时间总和,例如,我尝试这样做:

@Query("SELECT SUM(end_time-start_time) from daily_activity_time_table where start_time = date('now') ")
        fun getTodayTime(): Long

我可以使用此转换器将日期和时间打印到屏幕上:

@SuppressLint("SimpleDateFormat")
fun convertLongToDateString(systemTime: Long): String {
    return SimpleDateFormat("EEEE MMM-dd-yyyy' Time: 'HH:mm")
        .format(systemTime).toString()
}

但无法找到一种方法来打印用户今天activity

使用的所有时间

就个人而言,我会保留用于存储和检索持久数据的空间,并将整个计算部分放在不同的地方(即您的 ActivityViewModel 或存储库)

类似

@Entity
class TimeTrack(
    @PrimaryKey
    val id: Int,
    val startTime: Long,
    val endTime: Long,
    val sleepQuality: Int = -1
){
    val totalTime: Long
        get() = endTime - startTime
    
    // maybe this as well, gets the Local Date as LocalDate in case you want to filter by that
    val startDate: LocalDate
        get() = LocalDate.ofInstant(Instant.ofEpochSecond(startTime), ZonedDateTime.now().offset)
}
@Dao
interface TimeTrackDao {
    @Query("SELECT * FROM TimeTrack")
    suspend fun getTimeTracks(): List<TimeTrack>

    @Query("SELECT MAX(id) FROM TimeTrack ")
    suspend fun highestID(): Int

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun save(vararg consensus: TimeTrack)
}

然后在获得 activity 的开始和停止时间后:

    // this gives a nice unambiguous timestamp
    val startTime = Instant.now().epochSecond
    val stopTime = Instant.now().epochSecond
    val tt = TimeTrack(timeTrackDao.highestID()+1,
                       startTime,
                       stopTime,
                       sleepQuality = -1)
    timeTrackDao.save(tt)

    fun totalTimeSpentAt(timeTrackList: List<TimeTrack>): Duration = Duration.ofSeconds(timeTrackList.map{it.totalTime}.sum())

我做了一个非常简单的小项目,展示了如何从 Room 中提取日期范围内的数据(表示为自纪元以来的毫秒数)

https://github.com/or-dvir/RoomDate

请注意,这不是设置 Room 数据库的正确方法,并且此方法有其局限性(例如,它不考虑时区)。