在使用Room这个裤子的时候,你需要定义很多相关的实体类(Entity). 对于每一个实体而言, 他都对应数据库中的一张表,实体中的参数与数据库(database)进行绑定,用来进行相关操作.
一般而言,Entitiy(实体)中的每一个成员变量(field)都都对应Room 数据库模型中的一个列(colum).如果有些成员变量不需要进行映射那么你可以使用@Ignore进行注解. 在使用Room的Database类 对Entitiy实体对象进行操作时,你只能使用Entitiy数组.
如下代码片段展示了如何创建一个简单的实体类:
@Entity
class User {
@PrimaryKey
public int id;
public String firstName;
public String lastName;
@Ignore
Bitmap picture;
}
想要对实体熟悉进行映射, 那么Room必须获得对该类的访问权.你可以将属性定义成public, 或者为该属性提供getter和setter方法. 需要进行注意的是在Room中你要遵守JavaBeans命名规范(基本上就是getter 和 setter ,没有特别的操作不会出问题).
备注:
Entities 类可以不包含空的构造方法 (如果相关的Dao类能够取得各项属性的访问权) 也不必包含一个包含各种属性的构造方法. 当然啦你可以只对Room提供全部或者含有部分属性构造方法,这样构造器就只接收部分属性咯.
使用主键
实体类必需包含至少一个主键. 即便只有一个属性, 你也需要用@PrimaryKey 注解来标记该属性.当然啦,你需要使用@PrimaryKey注解来将实体属性自动绑定到主键上.如果实体采用复合主键,你可以使用@Entity 注解的primaryKeys属性, 示例代码块如下所示:
@Entity(primaryKeys = {"firstName", "lastName"})
class User {
public String firstName;
public String lastName;
@Ignore
Bitmap picture;
}
正常来讲, Room 使用实体类的类名来作为数据库中对应表的名称.当然了如果你有freestyle(打算自己起名字),那么你可以使用@Entity 注解的tableName属性来设置, 示例代码如下:
@Entity(tableName = "users")
class User {
...
}
注意:表名称是大小写敏感的.
与表名命名规则类似, Room 使用属性名称来作为列名称的定义. 如果你打算freestyle, 对相关属性变量添加@ColumnInfo 注解, 示例代码如下:
@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;
}
注解索引和唯一性
你可能想要对数据库中的熟悉做目录来加速你的查询,不过这取决你如何获取数据. 对实体类添加索引:@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;
}
备注:注解使用可能给你带来不必要的麻烦,若不是很熟悉那就不要轻易尝试这种骚操作.
有些情况下,某个或某些属性必需在数据库中具有唯一性. 你可以通过使用@index注解的 unique关键字来强制设置唯一性. 如下代码展示了如何在同一张表内避免 firstName和lastName列组合重名:
@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;
}
Define relationships between objects
介于Sqlite是一种关系型数据库,你能够了解各个对象之间的相互关系.纵使是有很多对象-关系 型的映射库能够允许实体对象相互映射,但我大Room是不可以的哦. 如果想要让我告诉你为那你去 看开Understand why Room doesn't allow object references. 这篇文章
虽然你不能使用直接关系,但是room还是允许你定义外健的.
例如,有个叫Book 的实体,你可以通过使用@ForeignKey 注解和user表建立关系, 示例代码如下所示:
@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;
}
外健功能十分强大,他们可以允许你在发生改变时候选择该更新那个实体. 例如, 你可以告诉数据删除所有的book当一个user相关对象被删除的时候,通过在使用 @ForeignKey 注解里面使用onDelete = CASCADE .
备注:
SQLite 数据库处理 @Insert(onConflict = REPLACE) (插入流程,冲突情况发生) 的流程就像一组 REMOVE和 REPLACE 操作,而不是一个UPDATE操作 这个方法可能会影响你的外健相关设置,想要了解更多详见:SQLite documentation ON_CONFLICT.
构建符合对象
有时候,你可以比较喜欢使用POJO的Javabean(POJO) 作为你的数据库模型, 即便这个对象包含了一些属性.在这些情况下, 你可以使用@Embedded注解来指代一个那些你希望作为实体属性相关对象 . 查询这些内部属性和查询其他的熟悉没有区别.
例如, 我们的User表可以包含一个Address类的嵌套属性, 用来代替代替street,city,state, andpostCode属性。使用@Embedded 注解可以存储内部嵌套对象,将内部嵌套对象的熟悉作为每个单独的列存储,示例代码如下.
class Address {
public String street;
public String state;
public String city;
@ColumnInfo(name = "post_code")
public int postCode;
}
@Entity
class User {
@PrimaryKey
public int id;
public String firstName;
@Embedded
public Address address;
}
生成的User表中的类如下:id,firstName,street,state,city, andpost_code.
注意:嵌套属性可以包含嵌套属性.
如何多层嵌套熟悉有重名现象,可以通过prefix 保持唯一性. Room 会在相关的嵌套属性上添加前缀.
@Embedded(prefix = "foo_")
Coordinates coordinates;
网友评论