从SQLite数据库填充MPAndroidChart BarChart

时间:2018-07-18 11:16:25

标签: android sqlite mpandroidchart

我已经学习了如何从固定数据创建MPAndroidChart条形图,但是需要从数据库中创建一个。我在这里和文档中都没有任何帮助。我要查询交易表中的收入按收入类别的总和,而不是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 个答案:

答案 0 :(得分:0)

您可以执行以下操作:-

1)在 BudgetDbHelper 类中创建一个方法,以按以下方式返回 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)例如,通过调用方法getBarEntries,从db的适当位置检索ArrayList。

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

4)使用返回的ArrayList代替硬编码的ArrayList。

  • 注意:上面的代码是内部代码,未经测试,因此可能包含错误。