6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Android/Kotlin】最小構成でRoomを使う

Last updated at Posted at 2020-12-31

環境

  • Mac
  • AndroidStudio4.1
  • Kotlin

前提知識

結論

ソースコード全文 - Github
AndroidStudioでGitHubを使う - Qiita

  • Entity、DAO、Databaseの3つで構成される
  • それぞれの内容は下記

Entity

テーブルの定義

DAO(Data Access Object)

クエリの作成

Database

どのEntity(テーブル)とDao(クエリ)を使うか指定

コード解説

build.gradle

バージョンとか変わってると思うので、動かなかったら
Room を使用してローカル データベースにデータを保存する - Android Developers
からコピペした方が良さそう

build.gradle(app)
dependencies {
    // ViewModel
    implementation "androidx.activity:activity-ktx:1.1.0" // Activityから使う時

    // LiveData
    def lifecycle_version = '2.0.0'
    implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version"

    // room
    def room_version = "2.2.5"
    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
    implementation "androidx.room:room-ktx:$room_version"
}

Entity

テーブルやカラムの指定
autoGenerateにしとくと自動で最小の数字を入れてくれる

Entity.kt
@Entity(tableName = "table_name")
data class SampleEntity(
    @PrimaryKey(autoGenerate = true) val id: Int, // autoGenerate = true でAutoIncrement
    @ColumnInfo(name = "word") val word: String?
)

Dao

SQL文を作成

Dao.kt
@Dao
interface SampleDao {
    @Query("SELECT * FROM table_name")
    fun loadLiveData(): LiveData<List<SampleEntity>>

    @Insert
    fun insert(vararg users: SampleEntity)

    @Query("DELETE FROM table_name")
    fun deleteAll()
}

Database

どのEntityとDAOを使うか指定

Database.kt
@Database(entities = [SampleEntity::class], version = 1) // 使用するEntityを指定
abstract class SampleDatabase : RoomDatabase() {
    // 使用するDaoを指定
    abstract fun sampleDao(): SampleDao

    // データベースのビルド
    // 書く場所はここじゃなくてもいい
    companion object {
        fun buildDatabase(context: Context): SampleDatabase {
            return Room.databaseBuilder(
                    context,
                    SampleDatabase::class.java, "database-name"
            ).build()
        }
    }

}

MainActivity

ボタンをクリックしたらDBに保存したり削除したりする

MainActivity.kt
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val viewModel: SampleViewModel by viewModels()


        // Roomの変更を検知し、変更時にtextViewの内容を変更する
        viewModel.wordLiveData.observe(this, Observer { value ->
            value?.let { textView.text = it.toString() }
        })

        // データ挿入
        buttonInsert.setOnClickListener {
            viewModel.insert(wordBox.text.toString())
        }

        // 全削除
        buttonDelete.setOnClickListener {
            viewModel.deleteAll()
        }
    }

}

ViewModel

Activity → ViewModel → Daoの順でアクセスしている
DBのビルド(どのDBを使うよーって宣言する)を一度だけ行いたいので、Activityと分けて記述

SampleViewModel
class SampleViewModel(application: Application) : AndroidViewModel(application) {

    private val dao: SampleDao
    init {
        val db = SampleDatabase.buildDatabase(application) // DBにアクセスするclassで一度だけDBをビルドする
        dao = db.sampleDao() // 使用するDaoを指定
    }

    // DBに保管された内容を表示
    val wordLiveData = dao.loadLiveData()

    // DBにデータを保存
    fun insert(word: String) {
        viewModelScope.launch(Dispatchers.IO) {
            dao.insert(
                SampleEntity(
                    id = 0, // autoGenerate で自動的にIDを入れるときは0を入れる
                    word = word
                )
            )
        }
    }

    // DBの内容を全て消す
    fun deleteAll() {
        viewModelScope.launch(Dispatchers.IO) {
            dao.deleteAll()
        }
    }

}

参考にした記事

公式サンプル
[Android] Room初心者が1から導入してみた手順
【Android】はじめてのRoom
ORMラッパーライブラリRoomをKotlinで使ってみる
RoomでPrimaryKeyがAutoIncrementの場合のInsert時のid指定

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?