Kotlin 中将 SQLite 字符串转换为小数并统计应用使用时长
学习笔记作者:admin日期:2025-05-25点击:31
摘要:提供了一个完整的 Kotlin 函数,用于从 SQLite 数据库中提取指定日期的各个应用使用时长,并将字符串格式的使用时间转换为小数。
功能概述
本文介绍了一个 Kotlin 函数,用于从 SQLite 数据库中提取指定日期的各个应用使用时长,并将字符串格式的使用时间转换为小数。
代码实现
import org.json.JSONArray
import org.json.JSONObject
import java.sql.SQLException
// 获取指定日期的app使用时长
fun getAppUsedTime(riqi: String): JSONObject {
val resultArray = JSONArray() // 存储最终结果
try {
val db = dbHelper.readableDatabase
// 1. 定义 SQL 查询语句(参数化查询)
val switchRecordsSql = """
SELECT
TITLE AS appname,
SUM(CAST(LINK AS REAL)) AS usedTime,
COUNT(*) AS usedCount
FROM shijian
WHERE LEI = 'APP使用记录'
AND ID LIKE ? || '%'
AND TITLE IS NOT NULL
AND LINK IS NOT NULL
GROUP BY TITLE
ORDER BY ID ASC
""".trimIndent()
// 2. 执行查询
db.rawQuery(switchRecordsSql, arrayOf(riqi)).use { cursor ->
if (cursor != null && cursor.moveToFirst()) {
do {
// 解析每一行数据
val appName = cursor.getString(cursor.getColumnIndexOrThrow("appname"))
val usedTime = cursor.getDouble(cursor.getColumnIndexOrThrow("usedTime"))
val usedCount = cursor.getInt(cursor.getColumnIndexOrThrow("usedCount"))
// 构造单个应用的 JSON 对象
val appUsage = JSONObject()
appUsage.put("appName", appName)
appUsage.put("usedTime", usedTime) // 单位为秒
appUsage.put("usedCount", usedCount)
// 添加到结果数组
resultArray.put(appUsage)
} while (cursor.moveToNext())
}
}
// 3. 返回结果
return JSONObject().put("data", resultArray)
} catch (e: SQLException) {
e.printStackTrace()
// 捕获数据库异常,返回空数据
return JSONObject().put("data", JSONArray())
} catch (e: Exception) {
e.printStackTrace()
// 捕获其他异常,返回空数据
return JSONObject().put("data", JSONArray())
}
}
功能详解
- SQL 查询的参数化:避免直接拼接字符串 $riqi,防止 SQL 注入。
- 结果集处理:使用 Cursor 遍历结果集,将每条记录解析为 JSON 对象。
- 异常处理:捕获数据库异常和其他异常,确保在发生错误时返回空的 JSON 数据结构。
- 返回值格式:返回的 JSON 格式如下:
{ "data": [ { "appName": "微信", "usedTime": 1234.56, "usedCount": 10 }, { "appName": "抖音", "usedTime": 987.65, "usedCount": 5 } ] }
注意事项
- LINK 列的转换:假设 LINK 列存储的是字符串格式的数字(如 "123.45"),使用 CAST(LINK AS REAL) 将其转换为浮点数。
- 单位转换:当前代码中,usedTime 的单位是秒。如果需要将其转换为毫秒或其他单位,可以在代码中进行调整。
- 性能优化:如果表数据量较大,建议为 LEI 和 ID 列创建索引,以提高查询效率。