简介
谷歌提供的数据库封装库,不建议直接用Sqlite
简单使用
- 配置依赖
def room_version = "2.2.5"
implementation "androidx.room:room-runtime:$room_version"
//java使用
annotationProcessor "androidx.room:room-compiler:$room_version"
//kotlin使用
//kapt "androidx.room:room-compiler:$room_version"
- 配置表
//默认表名是user,如果想要换可以通过tableName自定义
@Entity(tableName = "my_user")
public class User {
//每个表必须有primaryKey,如果需要Room自动分配可通过@PrimaryKey(autoGenerate = true)设置,该值默认false
//如果是复合主键,可通过@Entity(primaryKeys = {"firstName", "lastName"})设置
@PrimaryKey
public int uid;
//Room默认使用字段名称作为数据库中的列名称即firstName,如果想要自定义可以通过@ColumnInfo(name = "first_name")指定,默认值用defaultValue指定
@ColumnInfo(name = "first_name", defaultValue = "a")
public String firstName;
@ColumnInfo(name = "last_name")
public String lastName;
public String image;
public int level;
//Room会为@Entity标注的实体中每个字段都创建一个列,如果想要忽略某个字段使用@Ignore
//如果是继承的可以使用@Entity(ignoredColumns = {"", ""})设置
@Ignore
public String password;
//嵌套对象使用@Embedded注解,这是在Room中的表就会为Address中的street和city字段创建列,不会新建Address表,但是插入查询等操作不变,还是使用address,
@Embedded
public Address address;
}
public class Address{
public String street;
@ColumnInfo(name = "local_city", defaultValue = "火星")
public String city;
}
这边简单起见字段都用public,如果是private需要提供getter和setter方法,它们的名称要遵循Room中JavaBeans规范
此外,Sqlite是关系型数据库,Room可以在表之间添加关联
- 一对一关联
场景举例:每个用户至多只有一个收藏列表,想要查询出哪些用户有收藏列表
使用:
@Entity
public class User{
@PrimaryKey
public long uid;
}
@Entity
public class Collection{
@PrimaryKey
public long cid;
//子实体需包含父实体的主键的引用
public long uidInCol;
}
//为它们创建一对一关联类
public class UserAndCollection{
//引入其他实体需要@Embedded注解
@Embedded
public User user;
//子实体需要使用@Relation注解,其中parentColumn为父实体主键列名称,entiryColumn为引用父主键的名称
@Relation(parentColumn = "uid", entiryColumn = "uidInCol")
public Collection collection;
}
//最后在dao中使用查询
@Transaction //原子操作
@Query("SELECT * FROM user")
public List<UserAndCollection> getUsersAndCollections();
- .一对多关联
场景举例:每个用户可以有多个播放列表
使用:使用基本同一对一只是在创建关联的时候稍有不同,子实体需要用List
public class