Android Kotlin|Room DBの使い方と例


What is?


スタジオは、スポンサーの組み込みデータベースにデータを格納するオブジェクトリレーションシップマッピング(ORM)ライブラリです.簡単に言えば.ROOMの役割は、データベース内のオブジェクトをjavaまたはcortlin内のオブジェクトにマッピングすることです.
スタジオはSQLiteの抽象層の上にあり、SQLiteのすべての機能を提供し、便利なデータベースにアクセスできます.

Why?


ROMとSQLiteの違いは、

  • SQLiteの場合、コンパイル時にクエリエラーはチェックされませんが、ROOMではコンパイル中にSQLの互換性をチェックできます.

  • 変更を計画している場合は、SQLクエリーを手動で更新する必要がありますが、ROMは簡単に解決できます.

  • SQLiteでは、JavaまたはKotlinのオブジェクトを置き換えるには、Boiler Plate codeを使用する必要がありますが、スタジオでは、[オブジェクトリレーションシップマッピング](Object Relationship Mapping)を使用すると、共通の領域コードがない場合にマッピングできます.

  • スタジオでは、LiveDataとRxJavaの観測を作成して実行できますが、SQLiteではありません.
  • スタジオの構造



    スタジオは3つのコンポーネント(Database、Entity、Dao)で構成されています.
    データをDataBase-appに永続的に保存し、プライマリ・アクセス・ポイントと基本的に接続するために使用
    Entity:データベース内のテーブルをクラスとして表示します.
    ≪データベース・アクセス・オブジェクト|Database Access Objects|Eas≫-データベースにアクセスする方法が含まれます.(select、insert、delete...)

    ルームの使用

  • 簡単な自動登録例.
  • 勾配の設定

    dependencies {
        def room_version = "2.3.0"
    
        implementation "androidx.room:room-runtime:$room_version"
        annotationProcessor "androidx.room:room-compiler:$room_version"
    
        // optional - RxJava2 support for Room
        implementation "androidx.room:room-rxjava2:$room_version"
    
        // optional - RxJava3 support for Room
        implementation "androidx.room:room-rxjava3:$room_version"
    
        // optional - Guava support for Room, including Optional and ListenableFuture
        implementation "androidx.room:room-guava:$room_version"
    
        // optional - Test helpers
        testImplementation "androidx.room:room-testing:$room_version"
    
        // optional - Paging 3 Integration
        implementation "androidx.room:room-paging:2.4.0-rc01"
    }
  • 出典:Android Developer
  • Entityの設定

    import androidx.room.Entity
    import androidx.room.PrimaryKey
    import java.io.PipedWriter
    
    @Entity
    data class LoginEntity(
        val username: String,
        val password: String
    ) {
        @PrimaryKey(autoGenerate = true) var id: Int = 0
    }
    

    DAO設定

    import androidx.room.Dao
    import androidx.room.Insert
    import androidx.room.Query
    
    @Dao
    interface LoginDao {
    
        @Query("Select * From LoginEntity")
        fun getLogin() : LoginEntity
    
        @Query("DELETE From LoginEntity")
        fun deleteLogin()
    
        @Insert
        fun insetLogin(loginEntity: LoginEntity)
    
    }

    データベースの設定

    import android.content.Context
    import androidx.room.Database
    import androidx.room.Room
    import androidx.room.RoomDatabase
    
    @Database(
        entities = [LoginEntity::class],
        version = 1,
        exportSchema = false
    )
    
    abstract class LoginDatabase: RoomDatabase() {
        abstract fun loginDao() : LoginDao
    
        companion object {
            private var instance: LoginDatabase? = null
    
            @Synchronized
            fun getInstance(context: Context): LoginDatabase? {
                if (instance == null) {
                    synchronized(LoginDatabase::class) {
                        instance = Room.databaseBuilder(
                            context.applicationContext,
                            LoginDatabase::class.java,
                            "login-database"
                        )
                            .build()
                    }
                }
                return instance
            }
        }
    }

    MainActivity

    import android.content.Intent
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    import com.saehyun.roomexample.database.LoginEntity
    import com.saehyun.roomexample.database.LoginDatabase
    import com.saehyun.roomexample.databinding.ActivityMainBinding
    import kotlinx.coroutines.CoroutineScope
    import kotlinx.coroutines.Dispatchers
    import kotlinx.coroutines.async
    import kotlinx.coroutines.launch
    
    class MainActivity : AppCompatActivity() {
    
        private lateinit var binding: ActivityMainBinding
    
        private lateinit var db: LoginDatabase
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
    
            binding = ActivityMainBinding.inflate(layoutInflater)
            setContentView(binding.root)
    
            db = LoginDatabase.getInstance(applicationContext)!!
            refreshLogin()
    
            binding.btn.setOnClickListener {
                addLogin()
                refreshLogin()
                startLogin()
            }
        }
    
        private fun startLogin() {
            startActivity(Intent(applicationContext, SuccessActivity::class.java))
        }
    
        private fun addLogin() {
            val username = binding.etID.text.toString()
            val password = binding.etPW.text.toString()
    
            CoroutineScope(Dispatchers.IO).launch {
                db.loginDao().insetLogin(LoginEntity(username, password))
            }
        }
    
        private fun refreshLogin() {
            CoroutineScope(Dispatchers.Main).launch {
                val data = CoroutineScope(Dispatchers.IO).async {
                    db.loginDao().getLogin()
                }.await()
    
                if(data != null) {
                    binding.etID.setText("${data.username}")
                    binding.etPW.setText("${data.password}")
                }
            }
        }
    }

    activity_main

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="104dp"
            android:text="AutoLogin"
            android:textSize="24dp"
            android:textStyle="bold"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <EditText
            android:hint="ID"
            android:paddingLeft="24dp"
            android:id="@+id/etID"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="24dp"
            android:layout_marginTop="52dp"
            android:layout_marginEnd="24dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.0"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/textView" />
    
        <EditText
            android:hint="PW"
            android:paddingLeft="24dp"
            android:id="@+id/etPW"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="24dp"
            android:layout_marginTop="20dp"
            android:layout_marginEnd="24dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.0"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/etID" />
    
        <Button
            android:id="@+id/btn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:text="LOGIN"
            app:layout_constraintEnd_toEndOf="@+id/etPW"
            app:layout_constraintHorizontal_bias="0.498"
            app:layout_constraintStart_toStartOf="@+id/etPW"
            app:layout_constraintTop_toBottomOf="@+id/etPW" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    上記のコードを作成して実行することで、スタジオが正常に動作していることを確認できます.

    End


    上で使用した「自動登録」の例を羽状バニラに載せましたので、参考にして勉強してください.ありがとうございます.