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 列创建索引,以提高查询效率。

上一篇      下一篇