ルームをランダムに使用


「AndroidロボットはGoogleが作成したもので、私たちが共有している作品をコピーまたは修正するために使用され、Creative Commons 3.0の著者マークライセンスの条項と条件に従って使用されます.」

概要


AndroidでDBを使う方法は2つあります.
  • DB外部サーバとの通信
  • ローカルDB(SQLite)
  • を使用
    通常、OracleまたはMySQLが使用されます.
    なぜアンドロイドには違う使い方があるのでしょうか.
    アンドロイドはデータベースを直接バインドできません.
    セキュリティ上の問題のため、Oracleなどのデータベースに直接関連付けることはできません.
    逆に、SQLiteを内部データベースとして利用する方法を提供します.
    この方法をさらに発展させたのはRoomである.
    詳細は公式文書を参考にすることができます.

    インプリメンテーション


    ルームを使用するには、3つのコンポーネントを作成する必要があります.
  • Entity
    簡単に言えばTable
  • DAO
    これはCRUD行列を定義するインタフェースです.
    スタジオの紹介で、簡単に実現できました.
  • RoomDatabase
    データベースハンドルを含む抽象クラスで、データベースに接続するためのさまざまなsetup.
  • Entity

    @Entity
    data class RoomEntity(
        @PrimaryKey(autoGenerate = true) var id: Int,
        @ColumnInfo(name = "test_value") var testValue: String
    )
    彼らにこれが結末であることを知らせます.
    デザインシートのように記入すればいいです.
  • @PrimaryKeyPrimaryKeyのアシスタントを指定します.
    AutoGenerateを指定すると、キー値は自動的に1ずつ増加します.
  • @ColumnInfoデータベースに格納するカラム名を宣言する方法です.
    省略すると、変数の名前で保存されます.
  • DAO

    @Dao
    interface RoomDAO {
        @Query("SELECT * FROM RoomEntity")
        fun selectRoom() : List<RoomEntity>
    
        @Insert
        fun insertRoom(entity: RoomEntity)
    
        @Update
        fun updateRoom(entity: RoomEntity)
    
        @Delete
        fun deleteRoom(entity: RoomEntity)
    
    }
    CRUDマトリクスの挿入、削除などのインタフェースを定義します.
    Insert、Update、Deleteはツールによって実現されます.
    パラメータとして入力されたentityを処理します.

    Database

    @Database(entities = [RoomEntity::class], version = 1, exportSchema = true)
    abstract class MyRoomDatabase : RoomDatabase() {
        abstract fun getRoomDAO() : RoomDAO
    
        companion object {
            private var instance: MyRoomDatabase? = null
    
            fun getInstance(context : Context) : MyRoomDatabase {
                instance?.let {
                    return it
                } ?: run {
                    instance = Room.databaseBuilder(
                        context.applicationContext,
                        MyRoomDatabase::class.java,
                        "testRoom.db"
                    ).build()
                    return instance!!
                }
            }
        }
    }

    Activity


    今必要なものは全部できましたから、使いましょう.
            // UI init.
            binding.apply {
                btnRoom.setOnClickListener {
                    Thread {
                        Snackbar.make(it, "저장되었습니다.", Snackbar.LENGTH_SHORT).show()
    
                        val dao = MyRoomDatabase.getInstance(this@RoomActivity).getRoomDAO()
                        dao.insertRoom(
                            RoomEntity(0, edtRoom.text.toString())
                        )
    
                        val entityList = dao.selectRoom()
                        runOnUiThread {
                            tvRoom.text = ""
                            entityList.forEach {
                                tvRoom.text = tvRoom.text.toString().plus("\r\n ${it.testValue}")
                            }
                        }
                    }.start()
                }
            }
    以下に示すように、正常に動作していることがわかります.

    ちなみに、スタジオを実行するときは非同期処理を行います.
    メインスレッドで実行する場合
    次は同じ赤いExceptionです.
    java.lang.IllegalStateException: Cannot access database on the main thread since it may potentially lock the UI for a long period of time.
    // DB 작업이 많을 경우 UI가 멈출 수 있기 때문에 메인스레드에서 실행하는 것은 지양해야한다.
    ええと
    筆者は例としてThreadを用いた.
    通常または他の方法を使用することもできます.
    ちなみにAsyncTaskはAndroid 11からDepentedなので気をつけましょう.
    個人学習をベースに書いているからです.
    情報が正しくない可能性があります.
    知っていたら後で修正します
    いつでもフィードバックを歓迎します.
    読んでくれてありがとう.