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 类中 必须通过 一个 实体类 数组 进行引用实体类


图1

Use a primary key

    每一个实体类必须要添加 至少一个 primary key。即使类中只有一个字段,也必须添  加 @PrimaryKey 注释。 添加 @PrimaryKey(autoGenerate = true) Room 会分配自增长的IDS。如果不只有一个 PrimaryKey 的情况,使用  primaryKeys ,如下图:


图2

    Room 默认以实体类的 类名 作为 表 名字,也可以通过 tableName 指定 表名称。 如下图:


图3

Annotate indices and uniqueness

    如果想在数据库中索引某个字段来提高查询速度,可以通过在指定的字段上添加 indices 属性。有时要求字段是唯一的,那么就需要引用 @Index 的属性 unique 且值为 true。 如下图:


图4

Define relationships between objects

    因为SQLLite 是一种关系型数据库,所以也可以同样的创建 某种 对象之间的关系。可是Room 强调 大家还是不要这么做,至于原因 看  Understand why Room doesn't allow object references         但是Room允许添加外键 ,例如 假设有一个 实体 是 Book,使用 @ForeignKey  注释 定义与 User 之间的关系。 如下图:


图5

Note: 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会实现 将所有参数  插入数据库中


insert

        Update

         先根据 primary key 去查找相匹配的数据,再去修改


update

        Delete

        也是先去查找相匹配的实体再去删除


delete

Query for information

        简单的查询      @Query("SELECT * FROM user")                                                                                                         public User[] loadAllUsers();

        带参数查询      

多种情况

返回表中的某些列(字段)

    1 创建一个简单的类(POJO) 并 取得 目标实体类中的 某些字段                                                       2 在Dao 中 用上步骤中的 POJO 去查询 


1


2

Passing a collection of arguments                                                                                                   

看图即可

    Observable queries(可观察性的查询)

利用LiveData

    Querying multiple tables(链表查询)


你可能感兴趣的:(Room)