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

Android中如何将MySQL数据库数据解析至MPAndroidChart饼图?

没问题!我帮你梳理从MySQL取数据到MPAndroidChart饼图的完整流程,分几个核心步骤来,一步步来就很简单:

1. 先搞定后端接口:从MySQL取数据并返回JSON

首先你得有个后端接口,把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数据了。

2. Android端发起网络请求获取数据

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"。

3. 把数据绑定到MPAndroidChart饼图

假设你已经在布局里加了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:52:54