Androidアプリ内のデータベースにデータを保存する
アプリ内データベースにデータを保存する必要があったので勉強を兼ねて
前回作成した方位アプリの角度情報をDBに保存するプログラムを作成しました。

データベースを操作するためのSQLiteOpenHelperクラスを継承した
クラスを作成し、
定数でデータベース名とバージョン
テーブル名とカラム名
DBを操作するためのSQL文をそれぞれ定義しておきます。
onCreateメソッド内でSQL文を実行し テーブルを作成します 。
class AzimuthLogDB(context: Context) : SQLiteOpenHelper(context, DB_NAME, null, DB_VERSION) {
companion object {
private val DB_VERSION = 1
private val DB_NAME = "azimuthLog.db"
private val TABLE_NAME = "azimuthLog"
private val COLUMN_ID = "_id"
private val COLUMN_TIMESTUMP = "timeStump"
private val COLUMN_AZIMUTH = "azimuth"
public val TIME_STUMP = ("TIMESTUMP")
public val AZIMUTH = ("AZIMUTH")
private val SQL_CREATE_TABLE = String.format(
"CREATE TABLE %s (%s INTEGER PRIMARY KEY AUTOINCREMENT,%s INTEGER,%s REAL)",
TABLE_NAME,
COLUMN_ID,
COLUMN_TIMESTUMP,
COLUMN_AZIMUTH
)
private val SQL_DROP_TABLE = String.format("DROP TABLE IF EXISTS %s", TABLE_NAME)
private val SQL_SELECT_BETWEEN_TIMESTUMP = String.format("%s BETWEEN ? AND ?", COLUMN_TIMESTUMP)
}
override fun onCreate(db: SQLiteDatabase) {
db.execSQL(SQL_CREATE_TABLE)
}
override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
onCreate(db)
}
////
引数で受け取った値をDBへ保存するメソッドです。
writableDatabaseで書き込み可能なデータベースを受け取り、変数dbに保存
定数で定義したカラム名と対応する値のペアを作り
変数dbに作成した値のペアをinsertしてcloseします。
/**
* DBへデータ保存
* @param timeStump
* @param azimuth
*/
fun saveData(timeStump: Long, azimuth: Float) {
val db = this.writableDatabase
val values = ContentValues()
values.put(COLUMN_TIMESTUMP, timeStump)
values.put(COLUMN_AZIMUTH, azimuth)
db.insert(TABLE_NAME, null, values)
db.close()
}
DBからデータを読み取りJSONObject配列として返すメソッドです。
readableDatabaseで読み取り可能なデータベースを受け取り、変数dbに保存
変数dbのqueryメソッドでデータを読み取っています。
読み取ったデータはJSONObject化しループで配列化しています。
/**
* DBから情報を読み取り、JSONArrayとして返す
* @return
*/
fun loadData(): JSONArray {
val db = this.readableDatabase
val cursor = db.query(TABLE_NAME, null, null, null, null, null, null, null)
val jsonArray = JSONArray()
try {
while (cursor.moveToNext()) {
val jsonObject = JSONObject()
jsonObject.put(TIME_STUMP, cursor.getLong(1))
jsonObject.put(AZIMUTH, cursor.getFloat(2))
jsonArray.put(jsonObject)
}
} catch (e: JSONException) {
} finally {
db.close()
}
return jsonArray
}
読み取るデータの範囲を絞り込むためにデータを保存した日時カラム、timeStumpを対象にして、
変数dbの queryメソッドの
第三引数にWHERE句 “timeStump BETWEEN ? AND ?”を指定し、
第四引数にString配列{絞り込む範囲の初め, 絞り込む範囲の終わり}を指定しています。
第三引数に指定したSQL WHERE句 の’?’に対して、第四引数に指定したString配列の要素がインデックスが若い順に割り当てられています。
/**
* DBから絞り込み開始時間と終了時間を指定して情報を読み取り、JSONArrayとして返す
* @param startMilli 絞り込み条件開始ミリ秒
* @param endMilli 絞り込み条件終了ミリ秒
* @return
*/
fun loadData(startMilli: Long, endMilli: Long): JSONArray {
val db = this.readableDatabase
val cursor = db.query(
TABLE_NAME, null, SQL_SELECT_BETWEEN_TIMESTUMP,
arrayOf(startMilli.toString(), endMilli.toString()), null, null, null, null
)
val jsonArray = JSONArray()
try {
while (cursor.moveToNext()) {
val jsonObject = JSONObject()
jsonObject.put(TIME_STUMP, cursor.getLong(1))
jsonObject.put(AZIMUTH, cursor.getFloat(2))
jsonArray.put(jsonObject)
}
} catch (e: JSONException) {
} finally {
db.close()
}
return jsonArray
}
メソッドの呼び出し側です。
10秒ごとにタイムスタンプと最後に取得した方位角をsaveDataメソッドを使いデータベースに保存しています。
// 10秒ごとに最後に取得した方位角を保存するループ
mSaveAzimuthLog =
object : Runnable {
override fun run() {
val timeStump = GregorianCalendar.getInstance().timeInMillis
outputLogger(timeStump, mLastAzimuth)
mAzimuthLogDB.saveData(timeStump, mLastAzimuth)
mHandler.postDelayed(mSaveAzimuthLog, Util.secToMilli(10))
}
}
// 保存ループ開始
mHandler.post(mSaveAzimuthLog)
水曜担当:Tanaka
tanaka at 2019年08月28日 10:00:33