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

文章详细解释了如何在Android应用中使用RoomORM框架,包括@Entity注解的使用、主键设置、复合主键、索引的创建、外键约束以及数据库版本升级和与RxJava的集成。
摘要由CSDN通过智能技术生成

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)加上动作,他的意思是主键相同的话,旧数据会替换新数据。但如果我们主键不同,但加了索引唯一性的话,索引相同的话,这次插入则失败。相信这么说,应该明白了
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 =

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值