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