質問するログイン新規登録

回答編集履歴

2

データベースアクセスに関する内容を追加

2021/08/23 10:03

投稿

jimbe
jimbe

スコア13485

answer CHANGED
@@ -2,4 +2,69 @@
2
2
 
3
3
  ----
4
4
 
5
- xAxis.setLabelCount() の第二引数 force は false にしてください。
5
+ xAxis.setLabelCount() の第二引数 force は false にしてください。
6
+
7
+ ----
8
+
9
+ データベースのアクセス部分に付きましてコメントした関係上、対処例をご提示させて頂きます。
10
+ データベースに関する部分をメソッド化(readData)します。
11
+ ```java
12
+ interface ReadDataCallback {
13
+ enum Column { DATE, TOTAL }
14
+ void set(int row, Column column, String value);
15
+ }
16
+
17
+ private static final String COLUMN_DATE = "date";
18
+ private static final String COLUMN_AMOUNT = "amount";
19
+ private static final String COLUMN_AS_TOTAL = "total";
20
+
21
+ private void readData(String fromDate, String toDate, ReadDataCallback callback) {
22
+ DatabaseHelper helper = new DatabaseHelper(this);
23
+ SQLiteDatabase db = helper.getReadableDatabase();
24
+
25
+ try(Cursor cursor = db.query(
26
+ TABLE_NAME, //table
27
+ new String[]{COLUMN_DATE,"SUM("+COLUMN_AMOUNT+") AS "+COLUMN_AS_TOTAL}, //columns
28
+ COLUMN_DATE+" BETWEEN ? AND ?", //selection(WHERE)
29
+ new String[]{fromDate, toDate}, //selectionArgs
30
+ COLUMN_DATE, //groupBy
31
+ null, //having
32
+ COLUMN_DATE+" ASC" //orderBy
33
+ );) {
34
+
35
+ int dateIndex = cursor.getColumnIndex(COLUMN_DATE);
36
+ int totalIndex = cursor.getColumnIndex(COLUMN_AS_TOTAL);
37
+ for(int i=0; cursor.moveToNext(); i++) {
38
+ callback.set(i, ReadDataCallback.Column.DATE, cursor.getString(dateIndex));
39
+ callback.set(i, ReadDataCallback.Column.TOTAL, cursor.getString(totalIndex));
40
+ }
41
+ }
42
+ }
43
+ ```
44
+ 読み込む際はコールバックからラムダ式等を利用して各リストに格納します。
45
+ ```java
46
+ //barchart準備
47
+ barEntryList = new ArrayList<>();
48
+ barXAxisList = new ArrayList<>();
49
+
50
+ readData(fromDate, toDate, (row,column,value)->{
51
+ switch(column) {
52
+ case DATE:
53
+ barXAxisList.add(value);
54
+ break;
55
+ case TOTAL:
56
+ barEntryList.add(new BarEntry(row, Integer.parseInt(value)));
57
+ break;
58
+ }
59
+ });
60
+ ```
61
+ こうすると onCreate 内からはデータベースアクセスが無くなりますので、今回の件のようにデータベースは関係無い問題の場合に、
62
+ ```java
63
+ private void testData(String fromDate, String toDate, ReadDataCallback callback) {
64
+ callback.set(0, ReadDataCallback.Column.DATE, "2021-08-08");
65
+ callback.set(0, ReadDataCallback.Column.TOTAL, "17278");
66
+ callback.set(1, ReadDataCallback.Column.DATE, "2021-08-09");
67
+ callback.set(1, ReadDataCallback.Column.TOTAL, "4114");
68
+ }
69
+ ```
70
+ といったテスト用メソッドを作成して readData の呼び出しを testData の呼び出しに変更することで、データベースが無い環境(回答者側)でも再現がし易くなります。

1

追加

2021/08/23 10:02

投稿

jimbe
jimbe

スコア13485

answer CHANGED
@@ -1,1 +1,5 @@
1
- ぱっと見ですが ```xAxis.setLabelCount(7, true);``` 横方向のラベルは 7 個・・・と指定しているのでは無いでしょうか?
1
+ ぱっと見ですが ```xAxis.setLabelCount(7, true);``` 横方向のラベルは 7 個・・・と指定しているのでは無いでしょうか?
2
+
3
+ ----
4
+
5
+ xAxis.setLabelCount() の第二引数 force は false にしてください。