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

Android Studio中SQL分组统计数据无法加载至RecyclerView求助

问题分析与解决方案

核心问题

你的分组统计查询存在两个关键问题:

  1. SQL语法不严谨:在GROUP BY numberProd时,SELECT列表中的nameProd既不在GROUP BY子句中,也没有被聚合函数包裹。SQLite默认宽松模式下虽然不会直接报错,但会返回分组内任意一条记录的nameProd,结果不可控;若开启SQL严格模式,会直接抛出语法错误。
  2. Cursor数据获取依赖索引存在风险:直接通过索引(如getInt(0))获取数据,一旦查询语句的列顺序变化,会导致数据赋值错误。

分步解决方案

1. 修正SQL查询语句

根据业务逻辑选择以下两种写法之一:

  • 如果同一numberProd对应的nameProd是唯一的,将nameProd加入GROUP BY子句:
SELECT COUNT(*) AS amount, numberProd, nameProd 
FROM TABLE_MYDBProducts 
GROUP BY numberProd, nameProd
  • 如果同一numberProd可能对应多个nameProd,使用聚合函数(如MAX()/MIN())指定要返回的nameProd:
SELECT COUNT(*) AS amount, numberProd, MAX(nameProd) AS nameProd 
FROM TABLE_MYDBProducts 
GROUP BY numberProd

2. 优化Cursor数据获取逻辑

改用列名获取索引,避免索引偏移问题,同时增加索引有效性校验:

public ArrayList<Products> takeAmount() {
    DbHelper dbHelper = new DbHelper(context);
    // 查询操作使用getReadableDatabase更高效,无需写权限
    SQLiteDatabase db = dbHelper.getReadableDatabase();
    ArrayList<Products> listProducts = new ArrayList<>();
    Cursor cursorProducts = db.rawQuery(
        "SELECT COUNT(*) AS amount, numberProd, nameProd FROM " + TABLE_MYDBProducts + " GROUP BY numberProd, nameProd", 
        null
    );

    if (cursorProducts != null && cursorProducts.moveToFirst()) {
        // 获取列索引,避免硬编码索引
        int amountColIndex = cursorProducts.getColumnIndex("amount");
        int numberProdColIndex = cursorProducts.getColumnIndex("numberProd");
        int nameProdColIndex = cursorProducts.getColumnIndex("nameProd");

        // 校验索引有效性
        if (amountColIndex != -1 && numberProdColIndex != -1 && nameProdColIndex != -1) {
            do {
                Products products = new Products();
                products.setAmount(cursorProducts.getInt(amountColIndex));
                products.setNumberProd(cursorProducts.getString(numberProdColIndex));
                products.setNameProd(cursorProducts.getString(nameProdColIndex));
                listProducts.add(products);
            } while (cursorProducts.moveToNext());
        }
    }
    if (cursorProducts != null) {
        cursorProducts.close();
    }
    return listProducts;
}

3. 额外检查项

  • 确保DbDBMaster的构造函数正确初始化context:
public DbDBMaster(Context context) {
    super(context);
    this.context = context;
}
  • 检查Products实体类的setAmount()方法是否接收int类型参数,避免类型不匹配导致赋值失败。

内容的提问来源于stack exchange,提问作者Romina Rigoport

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 01:12:58