回答編集履歴

3

本文の編集

2015/11/02 08:57

投稿

退会済みユーザー
test CHANGED
@@ -1,4 +1,4 @@
1
- private static final int DATABASE_VIRSION = 1;の値を変更すること.
1
+ データベース構造を変更した際に,private static final int DATABASE_VIRSION = 1;の値を変更すること.
2
2
 
3
3
  SQL文を正しく作ること.の2つで解決するはずです.
4
4
 

2

文章の修正

2015/11/02 08:57

投稿

退会済みユーザー
test CHANGED
@@ -1,7 +1,11 @@
1
- private static final int DATABASE_VIRSION = 1;の値を変更すること.SQL文を正しく作ることで解決するはずです.
1
+ private static final int DATABASE_VIRSION = 1;の値を変更すること.
2
+
3
+ SQL文を正しく作ること.の2つで解決するはずです.
2
4
 
3
5
  参考までに,write()メソッドを呼ぶことで,データを追加できるサンプル.
4
6
 
7
+ Activityなどから,必要に応じて write(context, scanResultList, date);を呼ぶことでデータベースを更新できます.
8
+
5
9
  ```Java
6
10
 
7
11
  /* BaseColumns を使うなら これ自身に COLUM_ID を 定義する必要はありませんね */

1

readメソッドを作った

2015/10/28 13:42

投稿

退会済みユーザー
test CHANGED
@@ -134,14 +134,124 @@
134
134
 
135
135
 
136
136
 
137
- // 上手
137
+ /* データベースからデータを取ってくる */
138
-
138
+
139
- public static List<ScanResult> read(Context context) {
139
+ public static List<MyResult> read(Context context) {
140
+
140
-
141
+ /* Database を読み取り専用で開く */
142
+
143
+ final SQLiteDatabase db = new MySQLiteHelper(context).getReadableDatabase();
144
+
145
+
146
+
147
+ try {
148
+
149
+ /* rawQuery() にてデータベースから指定アイテムを取ってくる */
150
+
151
+ /* ? をわざわざ使わなくてもいいと考えるだろうが SQL インジェクション対策になる */
152
+
153
+ /* ダメな例) db.rawQuery("SELECT * FROM " + TABLE_NAME, new String[0]) */
154
+
155
+ /* もし TABLE_NAME に悪質なSQL文が入っていたら...? */
156
+
157
+ final Cursor cursor = db.rawQuery("SELECT * FROM ?", new String[]{TABLE_NAME});
158
+
159
+ try {
160
+
161
+ /* columnIndex は データベースを作った際に */
162
+
163
+ /* 実行した CREATE TABLE 句の 順番で割り振られている */
164
+
165
+ /* 手動で 0, 1, 2, 3 と振ることもできるが column 変更への耐性がなくなる */
166
+
167
+ /* 良くない例) int ssidIndex = 1; int freqIndex = 2; ... */
168
+
169
+ final int ssidIndex = cursor.getColumnIndex(COLUM_SSID);
170
+
171
+ final int freqIndex = cursor.getColumnIndex(COLUM_FREQ);
172
+
173
+ final int levelIndex = cursor.getColumnIndex(COLUM_LEVEL);
174
+
175
+ final int dateIndex = cursor.getColumnIndex(COLUM_DATE);
176
+
177
+
178
+
179
+ /* ArrayList のコンストラクタは 引数を取らなくてもよいが */
180
+
181
+ /* サイズがわかっている場合には 指定した方が 高速である */
182
+
183
+ /* ScanResult クラス は自分では扱えないため 自前で作ってみた */
184
+
185
+ final List<MyResult> scanResults = new ArrayList<>(cursor.getCount());
186
+
187
+
188
+
189
+ /* 最後まで cursor を動かす */
190
+
191
+ /* Cursor は結構特殊な 振る舞いをします この書き方は覚えておきましょう */
192
+
193
+ while (cursor.moveToNext()) {
194
+
195
+ final String ssid = cursor.getString(ssidIndex);
196
+
197
+ final int frequency = cursor.getInt(freqIndex);
198
+
199
+ final int level = cursor.getInt(levelIndex);
200
+
201
+ final long date = cursor.getInt(dateIndex);
202
+
203
+ scanResults.add(new MyResult(ssid, frequency, level, date));
204
+
205
+ }
206
+
141
- return null;
207
+ return scanResults;
208
+
209
+ } finally {
210
+
211
+ /* 忘れずに close させるために try-finally を使用 */
212
+
213
+ cursor.close();
214
+
215
+ }
216
+
217
+ } finally {
218
+
219
+ db.close();
220
+
221
+
222
+
223
+ }
142
224
 
143
225
  }
144
226
 
145
227
  }
146
228
 
229
+
230
+
231
+ class MyResult {
232
+
233
+ public final String ssid;
234
+
235
+ public final int frequency;
236
+
237
+ public final int level;
238
+
239
+ public final long date;
240
+
241
+
242
+
243
+ public MyResult(String ssid, int frequency, int level, long date) {
244
+
245
+ this.ssid = ssid;
246
+
247
+ this.frequency = frequency;
248
+
249
+ this.level = level;
250
+
251
+ this.date = date;
252
+
253
+ }
254
+
255
+ }
256
+
147
257
  ```