源文档链接

工程配置

implementation "android.arch.persistence.room:runtime:1.0.0"annotationProcessor "android.arch.persistence.room:compiler:1.0.0"// RxJava support for Room (use 1.1.0-alpha3 for latest alpha)implementation "android.arch.persistence.room:rxjava2:1.0.0"

表定义

定义Entity

默认情况,Room会为使用了@Entity注解的类中的每个属性建列,可以使用@Ignore忽略某个属性

@Entityclass User {    @PrimaryKey    public int id;    public String firstName;    public String lastName;    @Ignore    Bitmap picture;}

对于属性,Room必须能够使用,可以直接设置为public,后者提供setter/getter方法,使用set/get时,是使用的JavaBean中的约定

注意

实体类可以有无参构造器,也可以使用有参构造器(此时,对应的参数和属性的名字和类型要一一对应)

使用PrimariKey

每个Entity必须至少定义一个PrimaryKey的属性;想要使用Room自动定义ID时,可以使用PrimaryKeyautoGenerate属性;如果使用复合主键,可以使用EntityprimaryKey属性

如:

@Entity(primaryKeys = {"firstName", "lastName"})class User {    public String firstName;    public String lastName;    @Ignore    Bitmap picture;}

默认情况,Room使用类名作为表名,可以使用EntitytableName进行定义

@Entity(tableName = "users")class User {    ...}

注意

SQLite中的表名不区分大小写

tableName类似,Room使用属性的名字作为表中的列名,可以使用@ColumnInfoname进行定义

@Entity(tableName = "users")class User {    @PrimaryKey    public int id;    @ColumnInfo(name = "first_name")    public String firstName;    @ColumnInfo(name = "last_name")    public String lastName;    @Ignore    Bitmap picture;}

注释索引和唯一性

  1. 如果需要添加索引加快查询速度,可以使用Entity中的indices属性,指定索引(复合索引)

    @Entity(indices = {@Index("name"),        @Index(value = {"last_name", "address"})})class User {    @PrimaryKey    public int id;    public String firstName;    public String address;    @ColumnInfo(name = "last_name")    public String lastName;    @Ignore    Bitmap picture;}
  2. 为单个属性(多个属性)设置唯一性

    @Entity(indices = {@Index(value = {"first_name", "last_name"},        unique = true)})class User {    @PrimaryKey    public int id;    @ColumnInfo(name = "first_name")    public String firstName;    @ColumnInfo(name = "last_name")    public String lastName;    @Ignore    Bitmap picture;}

定义对象关系

SQLite是关系型数据库,可以指定对象之间的关系。Room禁止实体对象之间的互相引用。

虽然不可以直接引用,Room允许使用外键

User和Book通过ForeignKey建立关系

@Entity(foreignKeys = @ForeignKey(entity = User.class,                                  parentColumns = "id",                                  childColumns = "user_id"))class Book {    @PrimaryKey    public int bookId;    public String title;    @ColumnInfo(name = "user_id")    public int userId;}

针对上述代码,可以使用ForeginKey中的onDelete = CASCADE来告诉SQLite,当删除一个User时,那么这个User对应的所有Book也会同时删除

注意

SQLite处理@Insert(onConflict = Replace)会有一系列REMOVEREPLACE操作,而不是一个UPDATE操作。这个方法中的REPLACE操作中的冲突值可能影响外键,SQLite documentation

创建嵌套对象

当对象内部使用引用对象作为属性时,可以使用@Embedded来对该对象进行分解,再一次存入到对应的列中

class Address {    public String street;    public String state;    public String city;    @ColumnInfo(name = "post_code")    public int postCode;}@Entityclass User {    @PrimaryKey    public int id;    public String firstName;    @Embedded    public Address address;}

上述的代码建成的user表中,会有6个字段 – id,firstName,street,state,city,post_code

注意

Embedded属性可以包括其他的嵌入属性

如果实体中相同类型的属性具有多个,可以使用prefix属性来标明唯一性。Room会在对应的属性前加入prefix的值

更多相关文章

  1. andorid 自定义seekbar
  2. Android 自定义显示图片Dialog
  3. Android 图片手势缩放自定义View
  4. Android 三角标签(自定义Textview控件)
  5. 高德地图自定义Marker点击时出现的InfoWindow
  6. Android自动化工具Monkeyrunner使用(六) —— 根据ID查找对象
  7. 详解Android中自定义View的invalidate,Handler和postInvalidate
  8. android 自定义Dialog去除黑色背景
  9. Android 自定义广播

随机推荐

  1. 关于GitHub安装路径及Android(安卓)Studi
  2. Google官方教程:Android平板界面适配之屏
  3. Android(安卓)BLE学习(一): Android搜索BLE
  4. Android中关于Notification及Notificatio
  5. Android(安卓)贝塞尔曲线
  6. Android最新面试题汇总
  7. 点9图 Android设计中如何切图.9.png(点9图
  8. Android(安卓)ListView中加入Spinner的一
  9. Android(安卓)Studio如何去掉丑陋的标题
  10. Android(安卓)中Scheme协议的使用详解