Room 是 Android Architecture Components 的一部分,提供了一个抽象层,以便在 SQLite 上更加清晰和流畅地操作数据库。Room 确保在编译时检查 SQL 查询,并简化数据库工作。下面是如何在 Android 应用中使用 Room 进行增删改查(CRUD)操作的详细指南。

步骤 1: 添加 Room 依赖

首先,在你的项目的 build.gradle (Module: app) 文件中添加 Room 的依赖

dependencies {
    def room_version = "2.4.2"

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

步骤 2: 创建实体类

实体类表示数据库中的表。例如,创建一个 User 类作为实体:

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

@Entity(tableName = "users")
public class User {
    @PrimaryKey(autoGenerate = true)
    public int id;

    public String name;
    public String email;
}

步骤 3: 创建 DAO (Data Access Object)

DAO 定义了与数据库交互的方法。这些方法包括用于插入、删除、更新和查询数据的操作。

import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;
import java.util.List;

@Dao
public interface UserDao {
    @Insert
    void insertUser(User user);

    @Update
    void updateUser(User user);

    @Delete
    void deleteUser(User user);

    @Query("SELECT * FROM users")
    List<User> getAllUsers();

    @Query("SELECT * FROM users WHERE id = :id")
    User getUserById(int id);
}

步骤 4: 创建数据库

创建一个抽象类继承 RoomDatabase,包含应用中使用的所有实体和 DAO 的引用。

import androidx.room.Database;
import androidx.room.RoomDatabase;

@Database(entities = {User.class}, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

步骤 5: 使用数据库

最后,使用 Room 数据库执行操作。你可以在你的 Activity 或 Fragment 中这样做:

// 获取数据库实例
AppDatabase db = Room.databaseBuilder(getApplicationContext(),
        AppDatabase.class, "example-database").build();

// 获取 DAO
UserDao userDao = db.userDao();

// 创建用户
User newUser = new User();
newUser.name = "John Doe";
newUser.email = "john@example.com";

// 插入操作
new Thread(new Runnable() {
    @Override
    public void run() {
        userDao.insertUser(newUser);
    }
}).start();

// 查询操作
new Thread(new Runnable() {
    @Override
    public void run() {
        List<User> users = userDao.getAllUsers();
        // 处理查询到的用户列表
    }
}).start();

注意事项

  • 线程处理:Room 不允许在主线程上执行可能耗时的数据库操作,以避免阻塞 UI。因此,所有的数据库操作都应该在后台线程上执行,比如使用 AsyncTaskThread 或 ExecutorService
  • LiveData 和 ViewModel:为了响应式地更新 UI,你可以将 Room 与 LiveData 和 ViewModel 结合使用。Room 可以返回 LiveData 类型的数据,当数据库内容发生变化时,UI 可以自动更新。