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
使用的所有时间
就个人而言,我会保留用于存储和检索持久数据的空间,并将整个计算部分放在不同的地方(即您的 Activity
或 ViewModel
或存储库)
类似
@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
数据库的正确方法,并且此方法有其局限性(例如,它不考虑时区)。
我正在尝试在用户启动特定 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
使用的所有时间就个人而言,我会保留用于存储和检索持久数据的空间,并将整个计算部分放在不同的地方(即您的 Activity
或 ViewModel
或存储库)
类似
@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
数据库的正确方法,并且此方法有其局限性(例如,它不考虑时区)。