依赖
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
- 每个方法必须标明对应行为的注释,对应注释如下
- 增 @Insert
- 删 @Delete
- 查 @Query
- 改 @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!!"));
至此,Room的基本操作演示完毕。