Android Roomの利用ルールがすぐにわかる

2. 依存関係を追加する

1

2

3

dependencies {

    implementation "androidx.room:room-ktx:2.4.0"

}

2、主体

エンティティはデータベース内のテーブルを表すクラスを指し、アノテーションを使用してテーブル内の列を定義できます。次の例に示すように、エンティティ クラスには少なくとも 1 つの主キー フィールドが必要であり、他のフィールドを含めることもできます。

1

2

3

4

5

6

@Entity(tableName = "user")

data class User(

    @PrimaryKey val id: Int,

    @ColumnInfo(name = "name") val name: String,

    @ColumnInfo(name = "email") val email: String

)

3、ダオ

DAO はデータ アクセス オブジェクトを指し、データベースへのアクセス方法を定義するために使用されます。アノテーションを使用して SQL クエリを指定でき、Room が提供する一部のクエリ メソッドも使用できます。たとえば、いくつかの基本的なクエリを含む DAO の例を次に示します。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

@Dao

interface UserDao {

    @Query("SELECT * FROM user")

    fun getAll(): List<User>

    @Query("SELECT * FROM user WHERE id = :id")

    fun getById(id: Int): User?

    @Insert

    fun insert(user: User)

    @Update

    fun update(user: User)

    @Delete

    fun delete(user: User)

}

4、データベース

データベースは、バージョン番号やエンティティ クラスのリストなど、データベースに関連する構成情報を含むデータベース オブジェクトを指します。次の例に示すように、アノテーションを使用して、データベース構成情報と含まれるエンティティ クラスを指定できます。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

@Database(entities = [User::class], version = 1)

abstract class AppDatabase : RoomDatabase() {

    abstract fun userDao(): UserDao

    companion object {

        private var INSTANCE: AppDatabase? = null

        fun getInstance(context: Context): AppDatabase {

            return INSTANCE ?: synchronized(this) {

                val instance = Room.databaseBuilder(

                    context.applicationContext,

                    AppDatabase::class.java,

                    "app_database"

                ).build()

                INSTANCE = instance

                instance

            }

        }

    }

}

5. DAOインスタンスを取得する

Database オブジェクトのインスタンス メソッドを使用して、DAO インターフェイスのインスタンスを取得します。

1

2

val db = AppDatabase.getInstance(context)

val userDao = db.userDao()

6. DAO メソッドを呼び出す

DAOインターフェースのインスタンスメソッドを使用してデータベースにアクセスします。

1

2

3

4

5

6

7

val users = userDao.getAll()

val user = userDao.getById(1)

val newUser = User(2, "鸡你太美", "[email protected]")

userDao.insert(newUser)

newUser.email = "[email protected]"

userDao.update(newUser)

userDao.delete(newUser)

7. 使用手順

上記は Room の 3 つの主要なコンポーネントであり、次に Room を使用するための基本的な手順をいくつか示します。

  • 依存関係の追加: Room ライブラリの依存関係をプロジェクトの build.gradle ファイルに追加します。
  • エンティティ クラスの作成: データベース内のテーブルを表す 1 つ以上のエンティティ クラスを作成します。
  • DAO インターフェイスの作成: 1 つ以上の DAO インターフェイスを作成して、データベースにアクセスするためのメソッドを定義します。
  • Database オブジェクトを作成する: RoomDatabase から継承してデータベース オブジェクトを表す抽象クラスを作成し、 @Database アノテーションを使用してデータベースと含まれるエンティティ クラスの構成情報を指定します。
  • DAO インスタンスの取得: Database オブジェクトのインスタンス メソッドを使用して、DAO インターフェイスのインスタンスを取得します。
  • DAO メソッドの呼び出し: DAO インターフェイスのインスタンス メソッドを使用してデータベースにアクセスします。

別のことについて話しましょう、へへ

8. 取引

データベースに対して複数の操作を実行する場合、トランザクションを使用してデータの一貫性と整合性を確保できます。Room では、 @Transaction アノテーションを使用して、メソッドがトランザクションであることを指定できます。次に例を示します。

1

2

3

4

5

@Transaction

fun updateUserData(user: User, address: Address) {

    userDao.update(user)

    addressDao.update(address)

}

9. データベースの移行

当你需要修改数据库架构时,可以使用Room的数据库迁移功能来升级或降级数据库。在Room中,可以使用@Database注解中的version属性来指定数据库版本号,如果你需要进行迁移,你可以创建一个Migration对象,它包含了旧版本到新版本的变化信息,并将其添加到@Database注解中的migrations属性中,例如:

1

2

3

4

5

6

7

8

@Database(entities = [User::class], version = 2, exportSchema = false,

    migrations = [Migration(1, 2) { database ->

        database.execSQL("ALTER TABLE user ADD COLUMN phone TEXT NOT NULL DEFAULT ''")

    }]

)

abstract class AppDatabase : RoomDatabase() {

    // ...

}

10、视图(View)

在一些情况下,你可能需要使用多个表中的数据来创建一个视图(数据库视图!不是android.view)。在Room中,你可以使用@DatabaseView注解来定义一个视图,并使用@Query注解来指定视图的查询语句,例如:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

@DatabaseView(

    "SELECT user.id, user.name, address.city, address.country FROM user " +

    "INNER JOIN address ON user.address_id = address.id"

)

data class UserAddress(

    val id: Int,

    val name: String,

    val city: String,

    val country: String

)

@Dao

interface UserAddressDao {

    @Query("SELECT * FROM user_address")

    fun getAll(): List<UserAddress>

}

11、Flow!

实际上也支持RXJava,但是我不喜欢RX,可以结合Room、Flow和网络请求,做很酷的事情

1

2

3

4

5

6

7

8

@Dao

interface UserDao {

    @Query("SELECT * FROM user WHERE id = :id")

    fun getById(id: Int): Flow<User>

    @Query("SELECT * FROM user")

    fun getAll(): Flow<List<User>>

}

おすすめ

転載: blog.csdn.net/sinat_40572875/article/details/129303061