意思就是我们要往数据库里建表、建字段。就是使用这个bean对象。首先介绍下注解
- @Entity : 数据表的实体类。
- @PrimaryKey : 每一个实体类都需要一个唯一的标识。
- @ColumnInfo : 数据表中字段名称。
- @Ignore : 标注不需要添加到数据表中的属性。
- @Embedded : 实体类中引用其他实体类。
- @ForeignKey : 外键约束。
这里我们建一个Person类(为了能保存数据,使数据持久化且Room必须能够对它进行操作,你可以用public修饰属性,或者你也可以设置成private,但必须提供set和get方法)。这里只是简单展示,后面详细讲解,觉得细节太多了
表名为person的表:
@Entity
public class Person {
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = “uid”)
private int uid;
private String name;
private int age;
@Ignore
private int money;
@Embedded
private Address address;
//…我用的是private,暂且去掉了set和get方法。便于读者理解
}
public class Address {
private String city;
private String street;
//…省略部分代码,便于理解
}
2.1、@Entity
用了@Entity标注的类,表示当前类的类名作为表名,这个类里面的所有属性,作为表里的字段。这里我们先只关注@Entity来讲,后面又很多细节,文章接下来都以这种讲解分格。更加直击重点
2.1.1、如果不想用类名作为表名,我们可以这样
//这样的话,我们的表名就变成了 other
@Entity(tableName = “other”)
public class Person {
}
2.1.2、@Entity里的复合主键
在Person里,我们用@PrimaryKey(autoGenerate = true)标识uid为主键,且设置为自增长。设置为主键的字段不得为空也不允许有重复值。
复合主键:多字段主键则构成主键的多个字段的组合不得有重复(假如我们用name做主键,如果我们有2个name相同的数据一起插入,数据就会被覆盖掉。但是现实中真的有同名的人,是2条数据,这时候我们就要用name和出生日期作为复合主键也就是多个主键,主键都一致才会覆盖数据)
@Entity(primaryKeys = {“uid”,“name”})
public class Person {
}
直接这样设置后,运行项目。这里有几点要注意的:
- 首先会报错:You must annotate primary keys with @NonNull. “name” is nullable。所以要加上,
@Entity(primaryKeys = {“uid”,“name”})
public class Person {
//name字段要用@NonNull标注
@NonNull
private String name;
}
2.1.3、@Entity里的索引的使用
索引的使用(有单列索引和组合索引,还有索引的唯一性)
//单列索引 @Entity(indices = {@Index(value = “name”)})
//单列索引唯一性 @Entity(indices = {@Index(value = “name”, unique = true)})
//组合索引 @Entity(indices ={@Index(value = {“name”,“age”})})
//组合索引唯一性 @Entity(indices ={@Index(value = {“name”,“age”},unique = true)})
//当然可以混起来用 如下:
@Entity(indices ={@Index(value = “name”),@Index(value = {“name”,“age”},unique = true)})
public class Person {
}
- 数据库索引是用来提高数据库访问速度的,可以说单纯是优化的意思。我们加上索引后,之后的其他操作都没有变的
- 如果加上唯一性有点类似主键,重复数据会报错,但是索引并不像主键那样,作为条件才能去覆盖数据
- 插入数据的时候加上动作@Insert(onConflict = OnConflictStrategy.REPLACE)加上动作,他的意思是主键相同的话,旧数据会替换新数据。但如果我们主键不