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。因此,所有的数据库操作都应该在后台线程上执行,比如使用
AsyncTask
,Thread
或ExecutorService
。 - LiveData 和 ViewModel:为了响应式地更新 UI,你可以将 Room 与 LiveData 和 ViewModel 结合使用。Room 可以返回
LiveData
类型的数据,当数据库内容发生变化时,UI 可以自动更新。