Android中如何将MySQL数据库数据解析至MPAndroidChart饼图?
没问题!我帮你梳理从MySQL取数据到MPAndroidChart饼图的完整流程,分几个核心步骤来,一步步来就很简单:
首先你得有个后端接口,把MySQL里的饼图数据查出来,转成JSON格式给Android端。假设你的MySQL表叫pie_data,有category(分类名称)和value(对应数值)两个字段,这里用Spring Boot举个后端实现的例子:
- 先写实体类对应表字段:
public class PieData { private String category; private float value; // 记得加getter、setter和构造方法 }
- 然后写DAO层查询数据库:
@Repository public interface PieDataRepository extends JpaRepository<PieData, Long> { @Query("SELECT p FROM PieData p") List<PieData> getAllPieData(); }
- 最后写Controller提供接口:
@RestController @RequestMapping("/api") public class PieDataController { @Autowired private PieDataRepository repository; @GetMapping("/pie-data") public List<PieData> getPieData() { return repository.getAllPieData(); } }
这样访问http://你的后端IP:端口/api/pie-data,就能拿到类似[{"category":"餐饮","value":45},{"category":"购物","value":30},{"category":"娱乐","value":25}]的JSON数据了。
Android端推荐用Retrofit来做网络请求,简单省心。首先在Module级的build.gradle里加依赖:
implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
然后定义接口和实体类:
// 接口类 public interface PieDataApi { @GET("api/pie-data") Call<List<PieData>> getPieData(); } // 和后端一致的实体类 public class PieData { private String category; private float value; // getter、setter }
接下来发起请求:
// 初始化Retrofit,记得把baseUrl改成你的后端地址 Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://192.168.xx.xx:8080/") .addConverterFactory(GsonConverterFactory.create()) .build(); PieDataApi api = retrofit.create(PieDataApi.class); Call<List<PieData>> call = api.getPieData(); call.enqueue(new Callback<List<PieData>>() { @Override public void onResponse(Call<List<PieData>> call, Response<List<PieData>> response) { if (response.isSuccessful() && response.body() != null) { // 拿到数据就去更新饼图 updatePieChart(response.body()); } else { Toast.makeText(MainActivity.this, "数据为空", Toast.LENGTH_SHORT).show(); } } @Override public void onFailure(Call<List<PieData>> call, Throwable t) { Toast.makeText(MainActivity.this, "获取数据失败:" + t.getMessage(), Toast.LENGTH_SHORT).show(); } });
⚠️ 别忘了在AndroidManifest.xml里加网络权限:<uses-permission android:name="android.permission.INTERNET" />。如果是Android 9及以上,要么用HTTPS,要么在res/xml里创建network_security_config.xml允许明文请求,然后在Manifest的application标签里加上android:networkSecurityConfig="@xml/network_security_config"。
假设你已经在布局里加了PieChart:
<com.github.mikephil.charting.charts.PieChart android:id="@+id/pieChart" android:layout_width="match_parent" android:layout_height="match_parent" />
然后写updatePieChart方法来渲染饼图:
private void updatePieChart(List<PieData> dataList) { PieChart pieChart = findViewById(R.id.pieChart); // 把后端数据转成饼图需要的PieEntry列表 List<PieEntry> entries = new ArrayList<>(); for (PieData data : dataList) { entries.add(new PieEntry(data.getValue(), data.getCategory())); } // 创建数据集,设置样式 PieDataSet dataSet = new PieDataSet(entries, "消费占比"); dataSet.setColors(ColorTemplate.MATERIAL_COLORS); // 用默认的配色,也可以自定义颜色数组 dataSet.setValueTextColor(Color.BLACK); dataSet.setValueTextSize(12f); // 把数据集绑定到PieData PieData pieData = new PieData(dataSet); // 配置饼图的显示效果 pieChart.setData(pieData); pieChart.getDescription().setEnabled(false); // 隐藏底部描述 pieChart.setCenterText("月度消费统计"); // 中心显示的文字 pieChart.animateY(1000); // 添加上滑动画 pieChart.invalidate(); // 刷新图表 }
- 网络请求一定要在子线程执行,Retrofit的
enqueue已经帮你处理了,不用自己手动开线程。 - 前后端的字段名要完全一致,不然Gson解析会拿不到数据。
- 如果后端返回的是整数类型的数值,记得转成float再传给PieEntry。
- 要处理空数据的情况,比如后端返回空列表时,给用户显示提示或者空状态的饼图。
内容的提问来源于stack exchange,提问作者A.Mootaz

