【Android】Room数据库的使用

简介

Room 是在 SQLite 的基础上推出的 Android 库,它是 Google 官方对数据库操作的推荐方式。使用 Room 可以更方便、高效地操作 SQLite 数据库。

使用

添加依赖

在使用 Room 之前,需要在项目中添加 Room 相关的依赖。在 build.gradle 文件中添加以下依赖:

dependencies {
    def room_version = "2.3.0"

    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
}

在上面的依赖中,我们添加了 room-runtimeroom-compiler 两个依赖。其中,room-runtime 包含了 Room 库的核心功能,可以让我们进行数据库操作。而 room-compiler 则提供了一些必要的代码生成工具,帮助我们更方便地使用 Room。

数据库实体类

在使用 Room 之前,需要先定义数据表的结构。在 Room 中,数据表结构由实体类来定义。在实体类上使用 @Entity 注解来表示它对应一个数据表。以下是一个定义用户表的实体类:

@Entity(tableName = "user")
data class User(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    val name: String,
    val age: Int
)

在上面的代码中,我们使用 @Entity 注解将User类标记为一个数据表,其中:

tableName 表示此数据表的名称。
PrimaryKey 注解表示id字段是这个表的主键,并使用 autoGenerate = true 属性来表示 id 是自动生成的。

数据库访问对象(DAO)

在 Room 中,通过定义 DAO(Data Access Object) 接口来操作数据库。DAO 是一个抽象接口,其中定义了一些操作数据库的方法,例如增删改查等。在 DAO 接口上使用 @Dao 注解标记该接口。

以下是一个定义对用户表增删改查的 UserDao 接口:

@Dao
interface UserDao {
    @Insert
    suspend fun insert(user: User)

    @Update
    suspend fun update(user: User)

    @Delete
    suspend fun delete(user: User)

    @Query("SELECT * FROM user WHERE id = :id")
    suspend fun getById(id: Int): User

    @Query("SELECT * FROM user")
    suspend fun getAll(): List<User>
}

在上面的代码中,我们定义了插入、更新和删除用户记录的方法,以及根据 ID 获取用户和获取所有用户记录的方法。需要注意的是,我们为每一个方法都添加了 suspend 关键字,这意味着这些方法在协程中运行。

在上面的代码中,我们使用了 @Insert@Update@Delete@Query 注解来定义相应的操作。具体来说:

@Insert 注解用来定义插入数据的操作。
@Update 注解用来定义更新数据的操作。
@Delete 注解用来定义删除数据的操作。
@Query 注解用来定义查询数据的操作。在 Query 注解中,我们使用了 SQLite 语法来进行查询操作。

数据库

在定义好实体类和 DAO 接口之后,就可以定义数据库了。Room 中只有一个数据库实例,因此我们只需要定义一个具有 @Database 注解的类即可。

以下是一个定义用户数据库的 Database 类:

@Database(entities = [User::class], version = 1)
abstract class UserDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao

    companion object {
        private var INSTANCE: UserDatabase? = null

        fun getDatabase(context: Context): UserDatabase {
            return INSTANCE ?: synchronized(this) {
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    UserDatabase::class.java,
                    "user_database"
                ).build()
                INSTANCE = instance
                instance
            }
        }
    }
}

在上面的代码中,我们使用了 @Database 注解来标记 UserDatabase 类是一个数据访问对象。其中:

entities 属性表示此数据库中包含的实体类列表。
version 属性表示此数据库的版本号。
我们还定义了一个abstract的方法来获取 UserDao 实例。同时,我们还定义了一个companion object来提供获取数据库实例的静态方法。

使用

在定义好数据库后,我们可以开始使用它了。以下是一个使用示例:

// 获取数据库实例
val db = UserDatabase.getDatabase(context)

// 获取 UserDao 实例
val userDao = db.userDao()

// 插入用户
val user = User(name = "xiaoming", age = 18)
userDao.insert(user)

// 更新用户
user.age = 20
userDao.update(user)

// 查询所有用户
val userList = userDao.getAll()

// 查询指定用户
val id = 1
val user = userDao.getById(id)

在上面的代码中,我们首先获取 UserDatabase 实例,然后获取 UserDao 实例。接下来,我们使用 UserDao 实例进行插入、更新和查询操作。

需要注意的是,由于我们在 UserDao 中为每个方法添加了 suspend 关键字,因此调用这些方法时需要使用协程来运行。

你可能感兴趣的:(Android学习笔记,android,数据库)