ホーム
2022.3.9

kotlin Roomデータベースを使用する

Roomデータベースを使用し、追加、更新、削除するサンプルプログラムです。
1. gradleにRoomを使用するための記述を追加します。
2. Roomデータベースにアクセスする場合、コルーチンが必要になるのでそのための記述も追加します。
3. MyData.kt, MyDao.kt, MyDatabase.ktを作成します。それぞれdata class, interface, abstract classです。
4. MainActivity.ktで動作をテストしています。

build.gradle(:app)

plugins {
...
id 'kotlin-kapt' // for Room database
}

android {
...
}

dependencies {

...

// using room database.
def room_version = "2.4.2"
implementation "androidx.room:room-runtime:$room_version"
implementation "androidx.room:room-ktx:$room_version"
kapt "androidx.room:room-compiler:$room_version"

implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.5.2" // coroutine
}

MyData.kt

import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "my_table")
data class MyData(
@PrimaryKey(autoGenerate = true) var id: Int,
@ColumnInfo(name = "sort_position") var sortPosition: Int,
var name: String,
)

MyDao.kt

import androidx.room.*

@Dao
interface MyDao {
@Insert
suspend fun insert(myData: MyData): Long // row_idを返すことができます。

@Delete
suspend fun delete(myData: MyData)

@Update
suspend fun update(myData: MyData)

@Query("select * from my_table order by sort_position")
suspend fun getAll(): MutableList<MyData>

// IDを指定してデータを取得するように作成しました。MainActivityで削除するときに使っています。
@Query("select * from my_table where id = :id")
suspend fun findById(id: Int): MyData

// rowId を指定してデータを取得できるように作成しました。
@Query("select * from my_table where rowId = :rowId")
suspend fun findByRowId(rowId: Long): MyData
}

MyDatabase.kt

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase

@Database(entities = [MyData::class], version = 1)
abstract class MyDatabase: RoomDatabase() {
abstract fun getDao(): MyDao
companion object {
private const val DATABASE_NAME = "my_database"
fun getDatabase(context: Context): MyDatabase {
val builder = Room.databaseBuilder(
context.applicationContext,
MyDatabase::class.java,
DATABASE_NAME
)
return builder.build()
}
}
}

MainActivity.kt

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import com.example.sampledatabase.databinding.ActivityMainBinding
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

class MainActivity : AppCompatActivity() {
lateinit var binding: ActivityMainBinding
lateinit var myDatabase: MyDatabase
lateinit var myDao: MyDao
lateinit var myList: MutableList<MyData>

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)

// 初期化処理
myDatabase = MyDatabase.getDatabase(this)
myDao = myDatabase.getDao()
val ioScope = CoroutineScope(Dispatchers.IO)
val mainScope = CoroutineScope(Dispatchers.Main)

// 今あるデータをテキストビューに表示
showData()

// Insert のテスト
binding.btnAdd.setOnClickListener {
val name = binding.edtAddName.text.toString()
val myData = MyData(0, 9, name) // id=0 で作成するとインサート時に自動採番されます。
val context = this
ioScope.launch {
val rowId = myDao.insert(myData)
showData()

mainScope.launch {
Toast.makeText(context, rowId.toString(), Toast.LENGTH_SHORT).show()
}
}
}

// Update のテスト
binding.btnUpdate.setOnClickListener {
val id = binding.edtUpdateId.text.toString().toInt()
ioScope.launch {
val myData = myDao.findById(id)
myData.name = binding.edtUpdateName.text.toString()
myDao.update(myData)
showData()
}
}

// Delete のテスト
binding.btnDelete.setOnClickListener {
val id = binding.edtDeleteId.text.toString().toInt()
ioScope.launch {
val myData = myDao.findById(id)
myDao.delete(myData)
showData()
}
}
}

// txvSampleにデータベース内のデータを表示する処理
private fun showData() {
val ioScope = CoroutineScope(Dispatchers.IO)
val mainScope = CoroutineScope(Dispatchers.Main)
ioScope.launch {
myList = myDao.getAll()
var string = ""
for(elm in myList){
string += "id:" + elm.id.toString() + ", name:" + elm.name + "\n"
}
mainScope.launch {
binding.txvSample.text = string
}
}
}
}