从 SQLite 数据库填充 MPAndroidChart BarChart

Populate MPAndroidChart BarChart from SQLite database

我已经学会了如何从固定数据创建 MPAndroidChart 条形图,但需要从数据库创建一个。我在没有任何帮助的情况下查看了这里和文档。我想查询交易 table 以获取按收入类别划分的收入总和,而不是 barEntries 数组列表。这是查询:

SELECT SUM(income),income_category FROM transactions GROUP BY income_category;

下面是固定数据的代码:

public class CYIncomeChartActivity extends AppCompatActivity {

    SQLiteDatabase mSQLiteDatabase;

    BudgetDbHelper mDBHelper;

    SQLiteDatabase mSQLiteDatabase;

    // Database helper object //
    private BudgetDbHelper mDbHelper;

    BarChart barChart;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cy_income_chart);

        barChart = (BarChart) findViewById(R.id.cy_income_chart);

        barChart.setDrawBarShadow(false);
        barChart.setDrawValueAboveBar(true);
        barChart.setMaxVisibleValueCount(50);
        barChart.setPinchZoom(false);
        barChart.setDrawGridBackground(true);

        ArrayList<BarEntry> barEntries = new ArrayList<>();

        barEntries.add(new BarEntry(1, 40f));
        barEntries.add(new BarEntry(2, 44f));
        barEntries.add(new BarEntry(3, 30f));
        barEntries.add(new BarEntry(4, 36f));

        BarDataSet barDataSet = new BarDataSet(barEntries, "Data Set1");
        barDataSet.setColors(ColorTemplate.COLORFUL_COLORS);

        BarData data = new BarData(barDataSet);
        data.setBarWidth(0.9f);

        barChart.setData(data);

        String[] months = new String[] {"Jan", "Feb", "Mar", "Apr", "May","Jun"};
        XAxis xAxis = barChart.getXAxis();
        xAxis.setValueFormatter(new MyXAxisValueFormatter(months));
        xAxis.setPosition(XAxis.XAxisPosition.BOTH_SIDED);

    }

    public class MyXAxisValueFormatter implements IAxisValueFormatter {

        private String[] mValues;
        public MyXAxisValueFormatter(String[] values) {

            this.mValues = values;
        }

        @Override
        public String getFormattedValue(float value, AxisBase axis) {

            return mValues[(int)value];
        }
    }
}

请帮忙。谢谢!

您可以执行以下操作:-

1) 在 BudgetDbHelper class 到 return 一个 Arraylist 中创建一个方法:-

public ArrayList<BarEntry> getBarEntries() {
    String income_sum_column = "income_sum";
    SQliteDatabase db = this.getWriteableDatabase();
    String[] columns = new String[]{"SUM(income) AS " + income_sum_column,"income_category"};
    Cursor csr = db.query("transactions",columns,null,null,"income_category",null,null);
    ArrayList<BarEntry> rv = new ArrayList<>();
    while(csr.moveToNext()) {
        rv.add(new BarEntry(
            csr.getInt(csr.getColumnindex("income_category")),
            csr.getFloat(csr.getColumnIndex(income_sum_column))
        )
    }
    csr.close();
    return rv;
}

2) 在 CYIncomeChartActivity 中实例化 mDbHelper 例如:-

    setContentView(R.layout.activity_cy_income_chart); //<<<< as is
    mDbHelper = new BudgetDbHelper(this); //<<<< assumes signature is just context

3) 在 the/an 适当的位置,通过调用 getBarEntries 方法从数据库中检索 ArrayList,例如

   ArrayList<BarEntry> barEntries = mDbHelper.getBarEntries();

4) 使用 returned ArrayList 而不是硬编码的 ArrayList。

  • 注意以上代码为原理代码,未经测试,可能存在错误。