如何在 Android 中使用 Room 创建 SQLite 数据库

当你刚入行作为 Android 开发者时,理解如何使用 Room 库来创建和管理 SQLite 数据库可能会有点困难。本文旨在帮助你理解整个流程,并逐步指导你实现这一过程。

流程步骤

我们可以将创建数据库的流程分为以下几个步骤:

步骤 描述
1 添加 Room 依赖
2 创建实体类(Entity)
3 创建数据访问对象(DAO)
4 创建数据库类
5 使用数据库

接下来,我们将逐步探讨每一个步骤。

1. 添加 Room 依赖

build.gradle 文件中添加 Room 的依赖项。

dependencies {
    implementation "androidx.room:room-runtime:2.4.2" // Room 核心库
    annotationProcessor "androidx.room:room-compiler:2.4.2" // 制定模型类的注解处理器
}

在这段代码中,room-runtime 是使用 Room 库的核心API,而 room-compiler 则是在编译时处理你的实体类和 DAO 接口。

2. 创建实体类(Entity)

实体类是用来表示数据库中的表结构。我们以创建一个用户表为例。

import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "users") // 指定表名为 "users"
data class User(
    @PrimaryKey(autoGenerate = true) // 主键并自动生成
    val id: Int = 0,
    val name: String,
    val age: Int
)

在以上代码中,我们创建了一个名为 User 的数据类,它表示数据库中的用户表。@Entity 注解用于定义实体,并通过 @PrimaryKey 指定主键。

3. 创建数据访问对象(DAO)

DAO 是用于定义数据库操作的方法接口。

import androidx.room.Dao
import androidx.room.Insert
import androidx.room.Query

@Dao // 指定这是一个 DAO 接口
interface UserDao {
    @Insert // 插入方法
    suspend fun insert(user: User)

    @Query("SELECT * FROM users") // 查询所有用户
    suspend fun getAllUsers(): List<User>
}

在此代码中,UserDao 接口定义了两个方法:insert 用于插入用户数据,getAllUsers 用于查询所有用户。

4. 创建数据库类

我们需要创建一个数据库类来封装上述的实体和 DAO。

import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import android.content.Context

@Database(entities = [User::class], version = 1) // 指定数据库包含的实体
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao // 提供 DAO 的访问方法

    companion object {
        @Volatile
        private var INSTANCE: AppDatabase? = null

        fun getDatabase(context: Context): AppDatabase {
            return INSTANCE ?: synchronized(this) {
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    AppDatabase::class.java,
                    "app_database" // 数据库名称
                ).build()
                INSTANCE = instance
                instance
            }
        }
    }
}

在以上代码中,我们定义了一个名为 AppDatabase 的抽象类,它继承自 RoomDatabase。我们在这里声明了数据库的实体和版本,以及用于获取数据库实例的方法。

5. 使用数据库

现在我们就可以在应用代码中使用 Room 数据库了。

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

// 插入数据
val user = User(name = "Alice", age = 30)
userDao.insert(user)

// 查询数据
val allUsers = userDao.getAllUsers()

在这里,我们首先通过 AppDatabase.getDatabase(context) 获取数据库实例,然后通过 db.userDao() 获取 UserDao 实例。你可以简单地调用 insertgetAllUsers 方法与数据库交互。

类图

下面是我们创建的对象之间关系的类图:

classDiagram
    class User {
        +int id
        +String name
        +int age
    }
    class UserDao {
        +insert(user: User)
        +getAllUsers(): List<User>
    }
    class AppDatabase {
        +userDao(): UserDao
    }
    
    UserDao <-- AppDatabase : uses
    User -- AppDatabase : contains

结论

通过以上步骤,你可以成功在 Android 中使用 Room 来创建和管理 SQLite 数据库。这个流程虽然在初始阶段看起来复杂,但只要你逐步实施,就会变得更加简单。希望这篇文章对你有所帮助,期待你在 Android 开发的旅程中取得更好的进展!