You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中SQLite获取item_price列求和结果的问题排查

解决SQLite聚合查询求和结果的获取问题

嘿,我一眼就看到问题所在啦——你现在用c.getCount()来获取求和结果,但这个方法其实是返回游标里的行数(这里聚合查询只会返回1行,但这完全不是你要的sum计算值)。咱们来修正这个方法,一步步来:

问题分析

  • getCount()的作用是统计游标包含的记录条数,不是提取聚合函数计算出的数值。
  • 游标初始化后默认指向第一行之前的位置,直接取值会抛出异常,必须先移动到有效行。

修正后的代码

public static double countPrice(SQLiteDatabase db, int selectedID) {
    // 给聚合结果起别名,方便后续取值
    String[] sumPrice = new String[]{"SUM(item_price) AS total_price"};
    String selection = "list_id =? AND item_flag =?";
    String[] selectionArgs = new String[]{String.valueOf(selectedID), String.valueOf(0)};
    
    Cursor c = db.query(TABLE_NAME, sumPrice, selection, selectionArgs, null, null, null);
    
    double result = 0.0;
    // 先移动到游标第一行(聚合查询至少会返回1行,即使结果为0)
    if (c.moveToFirst()) {
        // 通过别名获取列索引,避免依赖列的顺序,更安全
        int columnIndex = c.getColumnIndexOrThrow("total_price");
        result = c.getDouble(columnIndex);
    }
    
    // 务必关闭游标,防止内存泄漏
    c.close();
    return result;
}

关键细节说明

  • 给聚合结果起别名:SUM(item_price) AS total_price让我们可以通过别名定位列,比直接用索引0更清晰,也避免后续修改查询列顺序导致的错误。
  • 移动游标到有效行:moveToFirst()确保游标指向查询返回的那一行数据,否则直接调用getDouble()会抛出CursorIndexOutOfBoundsException。
  • 关闭游标:用完游标后一定要关闭,不然会造成内存泄漏,这是Android数据库操作的基本规范。
  • 默认值处理:如果没有符合条件的记录,SUM()会返回NULL,这时候getDouble()会把它转为0.0,和我们初始化的默认值一致,符合业务预期。

内容的提问来源于stack exchange,提问作者Prin Puyakul

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:18:40