社内se × プログラマ × ビッグデータ

プログラミングなどITに興味があります。

Android(kotlin) データベースヘルパークラスをつくる

SQLite をつかいたい

Android アプリケーションで手軽に使えるデータベースとして、SQLite がある。
SQLite の利用手順はおおまかに以下のようになっている。
1. データベースヘルパークラスを作成
2. アクティビティから、データベース接続オブジェクトを生成する
3. データベース接続オブジェクトから、SQLを実行する

編集するファイル

以下の記事で作成したプロジェクトを引き続き編集します。
blueskyarea.hatenablog.com

  • DatabaseHelper.kt (新規作成)
  • MainActivity.kt
DatabaseHelper クラスをつくる

新しくクラスファイルを作成していきます。
f:id:blueskyarea:20200504113812p:plain

class DatabaseHelper(context: Context): SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {
    // To declare private variable
    companion object {
        // Name of database file
        private const val DATABASE_NAME = "level.db"
        // Version of database
        private const val DATABASE_VERSION = 1
    }

    override fun onCreate(db: SQLiteDatabase) {
        Log.i("DatabaseHelper", "Called onCreate()")
        // SQL statement to create table
        val sb = StringBuilder()
        sb.append("CREATE TABLE levels (")
        sb.append("_id INTEGER PRIMARY KEY,")
        sb.append("name TEXT,")
        sb.append("description TEXT")
        sb.append(");")

        // Execute the SQL
        db.execSQL(sb.toString())
        Log.i("DatabaseHelper", "Created table.")
    }

    override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
        Log.i("DatabaseHelper", "Called onUpgrade()")
    }
}

メモ
companion object
> クラス内に作成されるSingletonのこと。objectキーワードの前にcompanion修飾子を付与することで、クラスに属するSingletonが作成される。

android.util.Log
> ログレベルによって、関数が用意されている。Log.i や Log.e など。

DatabaseHelper オブジェクトの生成と解放処理
class MainActivity : AppCompatActivity() {
    private var levelId = -1
    private var levelName = ""
    // Create dbHelper object
    private var dbHelper = DatabaseHelper(this@MainActivity)

    override fun onCreate(savedInstanceState: Bundle?) {
        Log.i("MainActivity", "Called onCreate()")
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Find ListView for Level list
        val lvLevel = findViewById<ListView>(lvLevel)
        // Register the ListView to listener
        lvLevel.onItemClickListener = ListItemClickListener()
    }

    override fun onDestroy() {
        Log.i("MainActivity", "Called onDestroy()")
        // Release dbHelper object
        dbHelper.close()
        super.onDestroy()
    }
--- (省略) ---

メモ
private var dbHelper = DatabaseHelper(this@MainActivity)
> this@MainActivity で MainActivity のコンテキストを渡している

ビルド・実行

Run ボタンからアプリケーションをビルドし、エミュレーターを実行させた。
アプリケーションは正常に起動した。
f:id:blueskyarea:20200504115149p:plain

しかしながら、データベースファイルは生成されていない。
device file explorer から該当のプロジェクトを参照しても、"databases" ディレクトリが作成されていない。
f:id:blueskyarea:20200504115413p:plain
f:id:blueskyarea:20200504115423p:plain

Logcat でログを参照しても、DatabaseHelper の onCreate() が呼び出されていない。
MainActivity のクラス変数として、DatabaseHelper を定義した段階で呼び出されると想定していた。
f:id:blueskyarea:20200504115638p:plain