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

