Room 的使用步骤
接下来我们详细讲解一下如何在项目中使用 Room。
添加依赖
Room属于Jetpack中关于数据库操作的库,不属于安卓原生SDK开发包,所以需要单独添加依赖
// app/build.gradle dependencies { //添加room运行时依赖库 implementation "androidx.room:room-runtime:2.6.1" // Room 编译时注解处理器 annotationProcessor "androidx.room:room-compiler:2.6.1" // 可选:RxJava2 支持 (如果需要使用RxJava2的异步机制配合Room使用,需要添加这个依赖) implementation "androidx.room:room-rxjava2:2.6.1" // 可选:RxJava3 支持 (如果需要) implementation "androidx.room:room-rxjava3:2.6.1" }
定义 Entity实体类
首先,我们需要定义数据库中的表,这通过 Entity 注解来实现。假设我们要创建一个存储用户信息的表:
@Entity(tableName = "user") public class User { @PrimaryKey(autoGenerate = true) public int id; @ColumnInfo(name = "user_name") public String name; @ColumnInfo(name = "user_age") public int age; }
- @Entity 注解:用于定义一个表。tableName 是表名。
- @PrimaryKey 注解:用于定义主键,并且我们通过 autoGenerate = true 来实现主键的自动递增。
- @ColumnInfo 注解:用于定义列名。
定义数据库操作的方法 DAO
接下来,我们需要定义数据访问对象(DAO),用于与数据库进行交互。我们使用 @Dao 注解来标识 DAO 接口,并在其中定义具体的数据库操作方法,例如插入、删除、查询等。
@Dao public interface UserDao { @Insert void insertUser(User user); @Query("SELECT * FROM user WHERE user_name = :name") List<User> getUserByName(String name); //更新,这里没有自定义sql语句,但是Room会根据User中的主键来找到对应的数据 @Update void updateUser(User user); //如果不想通过实体类更新数据,而是通过具体的参数,那可以自行定义复杂的sql语句 @Query("UPDATE user SET age = :age WHERE uid = :uid") void updateUserAge(int uid, int age); // 删除指定用户ID的记录 @Query("DELETE FROM user WHERE uid = :userId") void deleteUserById(int userId); // 根据名字删除用户 @Query("DELETE FROM user WHERE name = :name") void deleteUserByName(String name); // 删除所有用户 @Query("DELETE FROM user") void deleteAllUsers(); }
- @Insert 注解:标识插入操作。
- @Query 注解:用于执行 SQL 查询。
- @Delete 注解:用于执行删除操作。
定义 Room Database数据库实例
最后,我们需要创建一个继承自 RoomDatabase 的类,用于初始化数据库并将 DAO 关联起来。
@Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
- @Database 注解:用于定义数据库的配置,entities 用于指定数据库中的实体类,version 指定数据库的版本号。
- RoomDatabase:这是一个抽象类,必须继承它来创建 Room 数据库。
初始化数据库
通过 Room 提供的 databaseBuilder 方法来创建数据库实例:
AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "user-database").build();
- databaseBuilder:用于创建 RoomDatabase 实例。这里我们指定了 AppDatabase 类和数据库名称 "user-database"。
访问数据库数据
创建数据库和 DAO 后,我们就可以通过 DAO 进行数据的增删改查操作了。
插入一个用户:
User user = new User(); user.name = "John"; user.age = 25; db.userDao().insertUser(user);
查询用户数据:
List<User> users = db.userDao().getUserByName("John");
Room 的异步操作
在 Android 开发中,访问数据库等 I/O 操作需要在异步线程中执行,以避免阻塞 UI 线程。
后面我们还会学到LiveData或者是RxJava,可以搭配Room轻松处理异步操作。例如,我们可以将查询操作与 LiveData 结合:
@Query("SELECT * FROM user") LiveData<List<User>> getAllUsers();
这种方式会自动监听数据库中的变化,并在数据更新时通知观察者。
版本升级与迁移
当数据库结构发生变化(例如新增列、修改表结构)时,需要升级数据库版本并实现数据迁移。Room 提供了 Migration 类来帮助我们进行数据库的迁移。
例如,假设我们要给 User 表添加一列 email,可以这样定义迁移:
static final Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(@NonNull SupportSQLiteDatabase database) { database.execSQL("ALTER TABLE user ADD COLUMN email TEXT"); } };
然后在创建数据库实例时应用这个迁移:
AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "user-database") .addMigrations(MIGRATION_1_2) .build();