回答編集履歴

2

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

2021/08/23 10:03

投稿

jimbe
jimbe

スコア13209

test CHANGED
@@ -7,3 +7,133 @@
7
7
 
8
8
 
9
9
  xAxis.setLabelCount() の第二引数 force は false にしてください。
10
+
11
+
12
+
13
+ ----
14
+
15
+
16
+
17
+ データベースのアクセス部分に付きましてコメントした関係上、対処例をご提示させて頂きます。
18
+
19
+ データベースに関する部分をメソッド化(readData)します。
20
+
21
+ ```java
22
+
23
+ interface ReadDataCallback {
24
+
25
+ enum Column { DATE, TOTAL }
26
+
27
+ void set(int row, Column column, String value);
28
+
29
+ }
30
+
31
+
32
+
33
+ private static final String COLUMN_DATE = "date";
34
+
35
+ private static final String COLUMN_AMOUNT = "amount";
36
+
37
+ private static final String COLUMN_AS_TOTAL = "total";
38
+
39
+
40
+
41
+ private void readData(String fromDate, String toDate, ReadDataCallback callback) {
42
+
43
+ DatabaseHelper helper = new DatabaseHelper(this);
44
+
45
+ SQLiteDatabase db = helper.getReadableDatabase();
46
+
47
+
48
+
49
+ try(Cursor cursor = db.query(
50
+
51
+ TABLE_NAME, //table
52
+
53
+ new String[]{COLUMN_DATE,"SUM("+COLUMN_AMOUNT+") AS "+COLUMN_AS_TOTAL}, //columns
54
+
55
+ COLUMN_DATE+" BETWEEN ? AND ?", //selection(WHERE)
56
+
57
+ new String[]{fromDate, toDate}, //selectionArgs
58
+
59
+ COLUMN_DATE, //groupBy
60
+
61
+ null, //having
62
+
63
+ COLUMN_DATE+" ASC" //orderBy
64
+
65
+ );) {
66
+
67
+
68
+
69
+ int dateIndex = cursor.getColumnIndex(COLUMN_DATE);
70
+
71
+ int totalIndex = cursor.getColumnIndex(COLUMN_AS_TOTAL);
72
+
73
+ for(int i=0; cursor.moveToNext(); i++) {
74
+
75
+ callback.set(i, ReadDataCallback.Column.DATE, cursor.getString(dateIndex));
76
+
77
+ callback.set(i, ReadDataCallback.Column.TOTAL, cursor.getString(totalIndex));
78
+
79
+ }
80
+
81
+ }
82
+
83
+ }
84
+
85
+ ```
86
+
87
+ 読み込む際はコールバックからラムダ式等を利用して各リストに格納します。
88
+
89
+ ```java
90
+
91
+ //barchart準備
92
+
93
+ barEntryList = new ArrayList<>();
94
+
95
+ barXAxisList = new ArrayList<>();
96
+
97
+
98
+
99
+ readData(fromDate, toDate, (row,column,value)->{
100
+
101
+ switch(column) {
102
+
103
+ case DATE:
104
+
105
+ barXAxisList.add(value);
106
+
107
+ break;
108
+
109
+ case TOTAL:
110
+
111
+ barEntryList.add(new BarEntry(row, Integer.parseInt(value)));
112
+
113
+ break;
114
+
115
+ }
116
+
117
+ });
118
+
119
+ ```
120
+
121
+ こうすると onCreate 内からはデータベースアクセスが無くなりますので、今回の件のようにデータベースは関係無い問題の場合に、
122
+
123
+ ```java
124
+
125
+ private void testData(String fromDate, String toDate, ReadDataCallback callback) {
126
+
127
+ callback.set(0, ReadDataCallback.Column.DATE, "2021-08-08");
128
+
129
+ callback.set(0, ReadDataCallback.Column.TOTAL, "17278");
130
+
131
+ callback.set(1, ReadDataCallback.Column.DATE, "2021-08-09");
132
+
133
+ callback.set(1, ReadDataCallback.Column.TOTAL, "4114");
134
+
135
+ }
136
+
137
+ ```
138
+
139
+ といったテスト用メソッドを作成して readData の呼び出しを testData の呼び出しに変更することで、データベースが無い環境(回答者側)でも再現がし易くなります。

1

追加

2021/08/23 10:02

投稿

jimbe
jimbe

スコア13209

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