@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)加上动作,他的意思是主键相同的话,旧数据会替换新数据。但如果我们主键不同,但加了索引唯一性的话,索引相同的话,这次插入则失败。相信这么说,应该明白了
2.1.4、@Entity里的外键约束
同样以之前的Person作为父类,我们再定一个衣服类Clothes。(这里先省略Dao,Database,Room步骤,后面会细讲)
Clothes:
@Entity(foreignKeys = @ForeignKey(entity = Person.class,parentColumns = “uid”,childColumns = “father_id”))
public class Clothes {
@PrimaryKey(autoGenerate = true)
private int id;
private String color;
private int father_id;
//…省略get和set
}
好多人不知道外键约束是什么意思,这里我们先往里面插数据,然后我们看看db里的数据:
第一步:我们往Person里面插入2填数据
1、(uid =1 name = 岩浆 age =18)
2、(uid =2 name = 小学生 age=10);
第二部:我们往衣服里面插入3条数据
1、(id = 1 color = 红色 father_id = 1)
2、(id = 2 color = 黑色 father_id = 1)
3、(id = 3 color = 红色 father_id = 2)
这里其实显而易见,可以先认为,person岩浆有2件衣服,红色和黑色的衣服;person小学生有1件衣服,红色的衣服。我们看看表是怎么样的。意思就是用parentColumns = “uid”(person的uid字段)作为childColumns = “father_id”(clothes的father_id字段)。这里就相当于约束到了。先不急,我们看看2张表。
person表(后面会有教程,教你怎么看db数据库):
clothes表
那么为什么说是外键约束呢?当然这里有操作。如下:
@Entity(foreignKeys = @ForeignKey(onDelete = CASCADE,onUpdate = CASCADE,entity = Person.class,parentColumns = “uid”,childColumns = “father_id”))
public class Clothes {
}
这里我加了2个动作,在删除和更新的时候用了onDelete = CASCADE,onUpdate = CASCADE。这里动作有以下:
- NO_ACTION:当person中的uid有变化的时候clothes的father_id不做任何动作
- RESTRICT:当person中的uid在clothes里有依赖的时候禁止对person做动作,做动作就会报错。
- SET_NULL:当person中的uid有变化的时候clothes的father_id会设置为NULL。
- SET_DEFAULT:当person中的uid有变化的时候clothes的father_id会设置为默认值,我这里是