Room
Save data in a local database using Room
Room 提供了一个Sqlite 抽象层,以便更轻松的访问数据。
3个主要的组成部分:
>Database: 包含数据库持有者,并作为与应用程序持久的关系数据的底层连接的主要入口点
带有 @Database 注释的类必须满足以下几点:
>是一个(abstract)抽象类 并 继承 RoomDatabase
>在注释中包含与数据相关联的实体类列表
> 包含一个抽象方法,这个方法没有参数,并且返回 一个带有注释 @Dao 的类
在运行的时候,你可以通过 Room.databaseBuilder() orRoom.inMemoryDatabaseBuilder() 去获取Dasebase 的实例。
> Entity :代表数据库中的表
>DAO :包含一些访问数据库的方法
Defining data using Room entities
使用room,要定义一些相关联的字段作为实体,关联数据库对的对象去存储每张表。默认情况下,Room会将实体类中的每个字段作为表中的 ‘列’,如果不想让某个字段作为列,可以添加 @Ignore。在Database 类中 必须通过 一个 实体类 数组 进行引用实体类
图1Use a primary key
每一个实体类必须要添加 至少一个 primary key。即使类中只有一个字段,也必须添 加 @PrimaryKey 注释。 添加 @PrimaryKey(autoGenerate = true) Room 会分配自增长的IDS。如果不只有一个 PrimaryKey 的情况,使用 primaryKeys ,如下图:
图2Room 默认以实体类的 类名 作为 表 名字,也可以通过 tableName 指定 表名称。 如下图:
图3Annotate indices and uniqueness
如果想在数据库中索引某个字段来提高查询速度,可以通过在指定的字段上添加 indices 属性。有时要求字段是唯一的,那么就需要引用 @Index 的属性 unique 且值为 true。 如下图:
图4Define relationships between objects
因为SQLLite 是一种关系型数据库,所以也可以同样的创建 某种 对象之间的关系。可是Room 强调 大家还是不要这么做,至于原因 看 Understand why Room doesn't allow object references 但是Room允许添加外键 ,例如 假设有一个 实体 是 Book,使用 @ForeignKey 注释 定义与 User 之间的关系。 如下图:
图5Note: SQLite handles @Insert(onConflict = REPLACE) as a set of REMOVE and REPLACE operations instead of a single UPDATE operation. This method of replacing conflicting values could affect your foreign key constraints. For more details, see the SQLite documentation for the ON_CONFLICT clause.
Create nested objects (将嵌套类 作为实体类中字段)
简单的看图就OK. Note: Embedded fields can also include other embedded fields(嵌入式的字段也可以包含 嵌入式的字段——也就是说在Address 类中可以有嵌入式的字段)
图6这样 在User 实体类所包含的字段 分别为 id, firstName, street, state, city, 和 post_code.
Accessing data using Room DAOs
Note: Before adding DAO classes to your app, add the Architecture Components artifacts to your app's build.gradle file.
一个DAO 可以是一个 interface or abstract class。 如果它是一个抽象类,它可以选择性地拥有一个构造器,它将RoomDatabase作为唯一的参数。房间在编译时创建每个DAO实现。需要注意的是 Room不支持 数据库访问在主线程上
Define methods for convenience (便捷的访问方法)
Insert
使用此注释,Room会实现 将所有参数 插入数据库中
insertUpdate
先根据 primary key 去查找相匹配的数据,再去修改
Delete
也是先去查找相匹配的实体再去删除
Query for information
简单的查询 @Query("SELECT * FROM user") public User[] loadAllUsers();
带参数查询
多种情况返回表中的某些列(字段)
1 创建一个简单的类(POJO) 并 取得 目标实体类中的 某些字段 2 在Dao 中 用上步骤中的 POJO 去查询
Passing a collection of arguments
看图即可Observable queries(可观察性的查询)
利用LiveDataQuerying multiple tables(链表查询)