アンドロイドルームにデータを格納(スタジオ)


🤔 スタジオは何ですか。What is Room???!?


  • 「スタジオはSQLiteの抽象層を提供し、シームレスなデータベースアクセスをサポートし、SQLiteを十分に活用しています.」https://developer.android.com/training/data-storage/room

  • スタジオはORM庫!?それは何ですか.
    ORMはオブジェクト-リレーショナルマッピングであり、リレーショナル・データベースはテーブルを使用し、オブジェクト向けにプログラミングしてオブジェクトを使用するため、不一致を生じ、クラスとテーブルをマッピングして変換して一致させる技術はORM技術である.

  • 簡単に言えば、スタジオはアプリケーションにデータを格納する際に内蔵の携帯電話データベースを使用します.これは書きやすいライブラリです.
  • 🧐 うん。しかしAndroidはSQLliteをサポートしているのではないでしょうか。


  • SQLiteはコンパイル時にクエリーのエラーをチェックできませんが、スタジオでクエリーの有効性をチェックできます.

  • SQLiteはモード変更時にSQLクエリーを手動で更新する必要がありますが、スタジオは簡単に更新できます!

  • SQLiteはORMをサポートしていません.データをオブジェクトに変換する必要があります.

  • スタジオは、LiveDataなどの光ファイバモードのデータを処理する際に作成して実行することができるが、SQLiteは実行できない.
  • 😅 OK Roomが良さそう!スタジオはどのように構成されていますか?



    😗 スタジオは3つの部分で構成されています!

  • DAO(Data Access Objects)
    ここでは、データベースの実行方法をインタフェース形式で作成して定義する場所です.
  • Entityは、データベース内のテーブルをクラスとして定義する場所です!
  • Room Database
    これは、EntityとDAOを組み合わせてデータベースを作成したり、バージョン管理したりする抽象クラスです.
  • 😙 では、使い方を見てみましょう。


    上の3つを見るときはまず何をしますか?
    👆 まずはEntityを定義!
    @Entity
    data class Todo(
       val title: String,
       val description: String?,
       val isDone: Boolean,
       @PrimaryKey val id: Int? = null
    )
    
  • Entityの作成時
    PrimaryKeyを1つ以上持っていなければなりません!
    上記の例では、変数名はテーブル列名ですが、直接名前を設定する場合は、
    @ColmonInfo(「name」)のプロンプトを使用して、
  • のカラム名を設定できます.
    2つ目はDaoを定義します!データベースでDaoを定義するから!
    @Dao
    interface TodoDao {
    
        @Insert(onConflict = OnConflictStrategy.REPLACE)
        suspend fun insertTodo(todo: Todo)
    
        @Delete
        suspend fun deleteTodo(todo: Todo)
    
        @Query("SELECT * FROM todo WHERE id = :id")
        suspend fun getTodoById(id: Int): Todo?
    
        @Query("SELECT * FROM todo")
        fun getTodos(): Flow<List<Todo>>
    
    }
  • Daoの作成時
    インタフェース形式に設定!
    宣言(@)を使用して、@Insert、@Update、@Delete機能を有効にします.
    別のクエリー文を使用する場合は、@Query("クエリー文")で作成できます.
  • 💪 最後にスタジオデータベースを定義します!
    @Database(
        entities = [Todo::class],
        version = 1
    )
    abstract class TodoDatabase: RoomDatabase() {
    
        abstract val dao: TodoDao
    
    }
  • データベース作成時
    抽象クラスとして作成し、データベース・アシスタントを使用
    上記のバージョンでは、後でアプリケーションを更新すると、テーブルの構造が変わります.
    昔のテーブルと区別するためと考えられます!
    ここでDaoにアクセスするので、Daoを返す抽象的な方法を使ったり、変数を使ったりすることができます!
  • @Database(entities = arrayOf(RoomCalendar::class), version = 1, exportSchema = false)
    abstract class RoomHelper: RoomDatabase() {
        abstract fun roomCalendarDao(): RoomCalendarInterface
    
        companion object{
            private var instance: RoomHelper?= null
    
            @Synchronized
            fun getInstance(context: Context): RoomHelper? {
                if (instance == null) {
                    synchronized(RoomHelper::class) {
                        instance = Room.databaseBuilder(
                            context.applicationContext,
                            RoomHelper::class.java,
                            "room-helper"
                        ).build()
                    }
                }
                return instance
            }
        }
    }
    上のコードは、RoomDatabaseを宣言する際にDBを単輪で初期化するコードです!
    //in mainActivity
     helper = RoomHelper.getInstance(mainActivity)!!
     helper.roomCalendarDao().getAll()
    Activityは1行のコードで簡単にDBを作成してアクセスできます!
    上記の方法がなければ書くたびにジェネレータを作成してcontext~に入れます.😂
    依存注入(di)を使ってコードを書く必要はありません!
    次の記事では依存項目についてお話しします!

    Reference


    https://developer.android.com/training/data-storage/room
    https://velog.io/@gang_shik/Android-Room
    https://velog.io/@dev_jin/AndroidKotlin-Room
    https://velog.io/@hyunho058/Room
    https://velog.io/@l2hyunwoo/Android-JetPack-Room