依赖

implementation("androidx.room:room-runtime:2.5.0")
annotationProcessor("androidx.room:room-compiler:2.5.0")

Entity实体类

注意

  • 类必须加上注释 @Entity(tableName = “xxx”)
  • 每一个属性必须加上注释@ColumnInfo(name = “xxx”)
  • 主键还需而外加上注释@PrimaryKey(autoGenerate = true)
  • 必须指定一个构造函数,如果有多个构造函数,其他构造函数必须添加注释@Ignore,必须有且只有一个构造函数不加注释@Ignore
  • 需要有Getter和Setter
@Entity(tableName = "user")
public class User {

    @PrimaryKey(autoGenerate = true)
    @ColumnInfo(name = "id")
    private int id;

    @ColumnInfo(name = "name")
    private String name;

    @ColumnInfo(name = "age")
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Ignore
    public User(int id) {
        this.id = id;
    }

    @Ignore
    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

DAO层

注意

  • 该层为接口,接口必须加上注释@Dao
  • 每个方法必须标明对应行为的注释,对应注释如下
  1. 增 @Insert
  2. 删 @Delete
  3. 查 @Query
  4. 改 @Update
  • 在行为注释里拼接SQL语句,语句允许带参数,格式为 :xxx,可以参考以下的getUserById、getUserByIds
  • 增返回值的含义为新增项的id,删、改的含义则为受影响的行数
@Dao
public interface UserDao {

    /**
     * 查询所有的数据,返回List集合
     */
    @Query("Select * from user")
    List<User> getAllUserList();

    /**
     * 传递参数的集合,注意 Room通过参数名称进行匹配,若不匹配,则编译出现错误
     */
    @Query("select * from user where id in (:userId)")
    List<User> getUserByIds(int[] userId);

    @Query("select * from user where id = :id")
    User getUserById(int id);

    /**
     * 返回一定条件约束下的数据,注意参数在查询语句中的写法
     */
    @Query("select * from user where age between :minAge and :maxAge")
    List<User> getUserByChosen(int minAge, int maxAge);

    /**
     * 插入数据,onConflict = OnConflictStrategy.REPLACE表明若存在主键相同的情况则直接覆盖
     * 返回的long表示的是插入项新的id
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    long insertUser(User user);

    /**
     * 更新数据,这意味着可以指定id然后传入新的user对象进行更新
     * 返回的long表示更新的行数
     */
    @Update
    int updateUser(User user);

    /**
     * 删除数据,根据传入实体的主键进行数据的删除。
     * 也可以返回long型数据,表明从数据库中删除的行数
     */
    @Delete
    int deleteUser(User user);

}

Room DataBase构建

注意

  • 该类为抽象类,需要继承RoomDatabase
  • 该类需要加上注释@Database(entities = 对应实体类.class, version = 1),version根据自己需求来
@Database(entities = User.class, version = 1)
public abstract class UserDB extends RoomDatabase {

    public abstract UserDao mUserDao(); //通常情况下,只需要这一个方法  

}

开始使用

初始化

    // 创建全局变量,方便使用
    private UserDao userDao;
    
    // 初始化
    userDao = Room.databaseBuilder(
                        getApplicationContext(),
                        UserDB.class,
                        "userDemo")
                .build()
                .mUserDao();

使用

注意, 数据库操作是不允许在主线程上进行的,需要在子线程操作,操作仅供参考

以调用增加示例

Observable.create(emitter -> new Thread(() -> emitter.onNext(userDao.insertUser(new User("Han0", 20)))).start())
        .subscribe(l -> System.out.println("insert success!!"));

image-1669953005933

至此,Room的基本操作演示完毕。