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-runtime
和 room-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 是自动生成的。
在 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 关键字,因此调用这些方法时需要使用协程
来运行。