Room

作者: codeCooler | 来源:发表于2018-05-15 14:37 被阅读9次

    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

          本文链接:https://www.haomeiwen.com/subject/ftkedftx.html