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

Android Studio中SQLite雷达图仅显示单个客户问题求助

Android RadarChart 多客户数据展示问题修复方案

问题根源

  • 全局共享同一个dataEntries列表,所有客户的销售数据被无差别累加,导致数据完全混叠。
  • 在遍历单条销售记录的循环内重复创建RadarDataSet和RadarData,每次都会覆盖之前的图表数据,最终仅保留最后一次循环的客户数据。
  • 使用like '%customer%'模糊查询,可能匹配到名称相似的无关客户,应该用精确匹配=。
  • Cursor未关闭,存在数据库资源泄漏风险。

修正后的代码

private void setupChartView() {
    RadarChart radarChart = findViewById(R.id.radarChart);
    radarChart.getDescription().setEnabled(false);

    // 初始化全局雷达数据对象,统一存放所有客户的数据集
    RadarData radarData = new RadarData();

    SQLiteDatabase db = new DatabaseHelper(this).getWritableDatabase();
    Cursor customerCursor = db.rawQuery("SELECT DISTINCT " + C_SALES_CUSTOMER + " FROM " + TABLESALES, null);

    if (customerCursor.moveToFirst()) {
        do {
            @SuppressLint("Range")
            String customer = customerCursor.getString(customerCursor.getColumnIndex(C_SALES_CUSTOMER));
            
            // 每个客户单独创建条目列表,彻底隔离不同客户的数据
            ArrayList<RadarEntry> customerEntries = new ArrayList<>();
            
            // 使用参数化查询精确匹配客户,避免模糊查询的错误匹配和SQL注入风险
            Cursor salesCursor = db.rawQuery("SELECT " + C_SALES_TOTAL + " FROM " + TABLESALES 
                    + " WHERE " + C_SALES_CUSTOMER + " = ?", new String[]{customer});
            
            if (salesCursor.moveToFirst()) {
                do {
                    @SuppressLint("Range")
                    int salesTotal = salesCursor.getInt(salesCursor.getColumnIndex(C_SALES_TOTAL));
                    customerEntries.add(new RadarEntry(salesTotal));
                } while (salesCursor.moveToNext());
            }
            
            // 仅当客户有销售数据时,创建数据集并添加到全局雷达数据中
            if (!customerEntries.isEmpty()) {
                RadarDataSet dataSet = new RadarDataSet(customerEntries, customer);
                // 可选:为不同客户设置差异化颜色,提升区分度
                // dataSet.setColor(Color.rgb(new Random().nextInt(256), new Random().nextInt(256), new Random().nextInt(256)));
                radarData.addDataSet(dataSet);
            }
            
            // 及时关闭销售数据游标,释放数据库资源
            salesCursor.close();
        } while (customerCursor.moveToNext());
    }

    // 一次性将所有客户的数据绑定到图表并刷新
    radarChart.setData(radarData);
    radarChart.invalidate();

    // 配置图例样式
    Legend legend = radarChart.getLegend();
    legend.setXEntrySpace(7f);
    legend.setYEntrySpace(5f);
    legend.setYOffset(75f);
    legend.setTextSize(16f);
    legend.setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);

    // 关闭游标和数据库连接,避免资源泄漏
    customerCursor.close();
    db.close();
}

关键修正点说明

  • 每个客户单独维护RadarEntry列表,确保数据完全隔离,不会出现累加混叠。
  • 统一创建RadarData对象,逐个添加所有客户的数据集后一次性绑定到图表,避免重复覆盖数据。
  • 使用参数化查询替代字符串拼接,既保证查询精度,又规避SQL注入风险。
  • 及时关闭所有Cursor和数据库连接,杜绝资源泄漏问题。
  • 调用radarChart.invalidate()强制刷新图表,确保数据更新后正确渲染。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:35:35