Kotlin 中将 SQLite 字符串转换为小数并统计应用使用时长
学习笔记作者:admin日期:2025-05-25点击:198
摘要:提供了一个完整的 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 列创建索引,以提高查询效率。