Kotlin 入門レベル1 SQLiteデータベース

KotlinでSQLiteデータベースに接続する書き方を解説します。データベースを活用するアプリケーションを開発する機会は とても多いです。しっかりと勉強して今後の開発に活かしていきましょう!今回の開発環境は「Android Studio Flamingo | 2022.2.1 Patch 2」を使用しており、UI製作は「Jetpack Compose」で Androidアプリケーションとして作成しています。アプリケーションを起動するとデータベース作成・テーブル作成・データを2件作成・データを取得して画面に表示という流れで処理されます。 あれこれ調べながら作成しましたが、未熟なため、いろいろおかしい箇所もあるかと思います。もし流用される場合は、適宜修正してください。ご利用は自己責任でお願いいたします。

※この記事は2023/06/18時点の情報です。

完成イメージ

Androidアプリケーションの完成イメージ

「AndroidManifest.xml」にストレージにアクセスするための権限を追加します。 具体的には次の1行を追加します。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

「AndroidManifest.xml」にストレージにアクセスするための権限を追加

今回作成するクラスは3本あります。この内の1本目は「SampleData.kt」クラスです。 このクラスはユーザー情報を格納するために利用します。

package com.sample.dbsample

/*
 * ユーザー情報を格納するクラス
 */
data class SampleData(
    val userId: Int,
    val userName: String
)

2本目は「DBHelper.kt」クラスです。SQLiteを簡単に操作するためにSQLiteOpenHelperを継承したクラスです。 コンポーザブルな関数の中でこのクラスを利用してデータベースに対して何かしらのアクションを起こしています。

package com.sample.dbsample

import android.content.ContentValues
import android.content.Context
import android.database.Cursor
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper

/*
 * データベースヘルパー
 * SQLiteOpenHelperを継承したクラス
 */
class DBHelper
    (context: Context?) :
    SQLiteOpenHelper(context, DB_NAME, null, DB_VERSION) {
    /*
     * テーブル作成
     */
    override fun onCreate(db: SQLiteDatabase) {
        try {
            // テーブル作成用SQL文
            val query = ("CREATE TABLE " + TABLE_NAME + " (" +
                    "userId INTEGER PRIMARY KEY AUTOINCREMENT, " +
                    "userName TEXT)")
            // SQL実行
            db.execSQL(query)
        } catch(e: Exception) {
            println(e)
        }
    }

    /*
     * テーブルにデータを新規登録
     * userIdカラムの値は自動採番されるので引数はUserNameのみ
     */
    fun sampleInsert(
        userName: String?,
    ) {
        try {
            // 書き込み可能でデータベースに接続
            val db = this.writableDatabase
            //セットする値を設定
            val values = ContentValues()
            values.put("userName", userName)
            // データを新規登録
            db.insert(TABLE_NAME, null, values)
            // 接続を閉じる
            db.close()
        } catch(e: Exception) {
            println(e)
        }
    }

    /*
     * データベースのアップグレード時の処理
     * 古いテーブルを削除して、新規テーブルを作成する
     */
    override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
        try {
            // テーブルを削除するSQL
            db.execSQL("DROP TABLE IF EXISTS $TABLE_NAME")
            // テーブルを新規作成
            onCreate(db)
        } catch(e: Exception) {
            println(e)
        }
    }

    /*
     * データベースから取得したデータを配列にセットして返す
     */
    fun sampleSelect(): ArrayList {
        //呼び出し元に戻す値
        val courseModelArrayList: ArrayList = ArrayList()

        try {
            //読み取り専用でデータベースにアクセス
            val db = this.readableDatabase
            //データを取得するSQL
            val cursorCourses: Cursor = db.rawQuery("SELECT * FROM $TABLE_NAME", null)
            //件数分ループ
            if (cursorCourses.moveToFirst()) {
                do {
                    //配列にセット
                    courseModelArrayList.add(
                        SampleData(
                            //1個目のカラム(userId)の値
                            cursorCourses.getInt(0),
                            //2個目のカラム(userName)の値
                            cursorCourses.getString(1)
                        )
                    )
                } while (cursorCourses.moveToNext())
            }
            //カーソルを閉じる
            cursorCourses.close()
            //リターン
            return courseModelArrayList
        } catch(e: Exception) {
            println(e)
            return courseModelArrayList
        }
    }

    /*
     * 定数
     */
    companion object {
        //データベースの名前
        private const val DB_NAME = "sample"
        //バージョン
        private const val DB_VERSION = 1
        //テーブル名
        private const val TABLE_NAME = "sample_table"
    }

}

3本目は「MainActivity.kt」です。このアプリケーションのメインのソースです。新規プロジェクト作成で「Empty Activity」テンプレートを選択した際に自動作成された「MainActivity.kt」を修正しました。 新規プロジェクト作成に関してはコチラの記事を参考にしてください。【はじめてのAndroidアプリケーション(Kotlin)】


package com.sample.dbsample

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.tooling.preview.Preview
import com.sample.dbsample.ui.theme.DBSampleTheme

//DataBase関連で使用
import android.content.Context

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            DBSampleTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    //SQLiteデータベースに関するサンプル処理
                    Greeting(LocalContext.current)
                }
            }
        }
    }
}

/*
 * SQLiteデータベースに関するサンプル処理
 */
@Composable
fun Greeting(context: Context) {
    //データベースヘルパーを使用する
    val dbHandler: DBHelper = DBHelper(context);
    //データを新規で2件登録する
    dbHandler.sampleInsert("ポンコツ男子")
    dbHandler.sampleInsert("ポンコツ女子")

    //データベースから取得したデータを格納する配列を用意
    lateinit var dbList: List
    dbList = ArrayList()
    //データベースからデータを取得
    dbList = dbHandler.sampleSelect()!!

    //画面に出力
    Column {
        //データ件数分ループ
        for(item in dbList) {
            //ユーザーIDとユーザー名をテキストで表示
            Text(
                text = "userID: ${item.userId}  userName: ${item.userName}",
            )
        }
    }
}

/*
 * プレビュー用
 */
@Preview(showBackground = true)
@Composable
fun GreetingPreview() {
    DBSampleTheme {
        Greeting(LocalContext.current)
    }
}

ここまでSQLiteデータベースに接続してデータを登録・参照する方法を解説してきましたが理解できましたか?

SQLiteデータベースに接続する方法を覚えられましたか?

アプリケーションとデータベースはセットみたいなものなので、 初心者の人はKotlinに加えてデータベースのSQLなども勉強しなければならないので大変かと思います。 ですが、DBまわりのスキルを身につけておけば仕事の幅は確実に広がるので頑張って覚えましょう!

管理人情報