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
相关产品推荐
相关产品推荐

