Android从零开始搭建MVVM架构(4)————Room(从入门到进阶)

本文详细介绍了如何在RoomORM框架中使用索引优化查询,外键约束实现关联关系,以及数据库版本升级策略。同时探讨了如何结合RxJava进行异步数据库操作,包括Insert、Delete和Query操作的使用示例。
摘要由CSDN通过智能技术生成

@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会设置为默认值,我这里是
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值