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



アプリ関連ニュース

お問い合わせはこちら

お問い合わせ・ご相談はお電話、またはお問い合わせフォームよりお受け付けいたしております。

tel. 06-6454-8833(平日 10:00~17:00)

お問い合わせフォーム