Room
使用主键
使用Room持久性库时,可以将相关字段集合定义为实体。 对于每个实体,在关联的数据库对象中创建一个表来保存这些项目。
默认情况下,Room会为实体中定义的每个字段创建一个列。 如果实体具有不想保留的字段,==则可以使用@Ignore对其进行注释==。 您必须通过Database类中的实体数组引用实体类。
主键:
每个实体必须有一个字段作为主键
使用@PrimaryKey标识
@PrimaryKey
public int uid;
如果需要自动分配主键:可以使用
@PrimaryKey(autoGenerate = true)
public int uid;
如果有多个主键则可以使用:
@Entity(primaryKeys = {
"firstName,lastName"})
public class User {
@ColumnInfo(name = "firstName")
public String firstName;
@ColumnInfo(name = "lastName")
public String lastName;
@Ignore
public Bitmap picture;
}
默认情况下Room使用类名作为数据库表明,如果需要指定表名,可以使用:
@Entity(tableName = "users")
public class User {
}
==警告:SQLite中的表名是不区分大小写的。==
与tableName相同,Room使用字段名作为数据库的列名称,如果你希望修改列名称,请使用@Columninfo注解
@ColumnInfo(name = "firstName")
public String firstName;
注释索引和唯一性
如果你经常查询某个字段,可以对该字段简历索引,以加快查询速度。要向字体添加索引,请使用@Entity注解中的indices属性:
单列索引
@Entity(indices = {
@Index("firstName")})
联合索引
@Entity(indices = {
@Index(value = {
"firstName","lastName"})})
注意在建立索引时,应该考虑以下准则:
- 索引不应该使用在较小的表上。
- 索引不应该使用在有频繁的大批量的更新或插入操作的表上。
- 索引不应该使用在含有大量的NULL值的列上。
- 索引不应该使用在频繁操作的列上。
唯一性
在数据库中某些字段或字段组必须唯一,可以通过将@index注释的==unique==属性设置为ture,
字段唯一
@Entity(indices = {
@Index(value = "firstName",unique = true)})
字段组唯一
@Entity(indices = {
@Index(value = {
"firstName","lastName"},unique = true)})
注意:字段组唯一,必须是数据中存在一条数据,firstName字段和lastName字段和新增加的字段都相等,才认定为是重复的。如果只有一个字段重复,都可以通过unique验证。
定义对象之间的关系
如果有另一个名为Book的实体,则可以使用@ForeignKey注释来定义它与User实体的关系,例如:
@Entity(indices = {
@Index(value = {
"firstName","lastName"},unique = true)})
public class User {
@PrimaryKey(autoGenerate = true)
public int id;
@ColumnInfo(name = "firstName")
public String firstName;
@ColumnInfo(name = "lastName")
public String lastName;
@Ignore
public Bitmap picture;
}
@Entity(foreignKeys = @ForeignKey(entity = User.class,parentColumns =