回答編集履歴
3
本文の編集
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
文章の修正
test
CHANGED
@@ -1,7 +1,11 @@
|
|
1
|
-
private static final int DATABASE_VIRSION = 1;の値を変更すること.
|
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メソッドを作った
test
CHANGED
@@ -134,14 +134,124 @@
|
|
134
134
|
|
135
135
|
|
136
136
|
|
137
|
-
/
|
137
|
+
/* データベースからデータを取ってくる */
|
138
|
-
|
138
|
+
|
139
|
-
public static List<
|
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 nul
|
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
|
```
|