likes
comments
collection
share

Android数据缓存框架 - 内置ORM功能

作者站长头像
站长
· 阅读数 11

前面我介绍了数据缓存的设计,由于缓存也依赖数据存储,所以我直接把开源代码网址发给大家,供大家学习 github.com/dora4/dcach… 。使用教程如下:

  1. 配置初始化

    Orm.init(this, OrmConfig.Builder()
                    .database("dcache_sample")
                    .tables(Account::class.java)
                    .version(1)
                    .build())
    

    在自定义的Application类的入口加入一行配置,database为数据库名,version从1开始每次递增1,tables用来配置需要初始化的表,dcache中所有的表需要实现OrmTable接口。

  2. 注解详解

    • 表和列相关

      • @Table

        此注解配置在OrmTable的实现类的类名之上,用来指定一个类映射到表的名称

      • @Column

        此注解配置在OrmTable的实现类的成员属性之上,用来指定一个属性映射到字段的名称

      • @Ignore

        此注解的优先级高于@Column,配置在OrmTable的实现类的成员属性之上,配置了此注解的成员属性,不会作为表的字段进行映射

    • 约束相关

      • @NotNull

        此注解配置在OrmTable的实现类的成员属性之上,用来指定这个字段为非空字段

      • @PrimaryKey

        此注解配置在OrmTable的实现类的成员属性之上,用来指定这个字段为表的主键

      • @Id

        此注解配置在OrmTable的实现类的成员属性之上,作用类似于@PrimaryKey,并

        在它的基础上指定了该字段名为”_id“,相当于@PrimaryKey+@Column("_id")

      • @Unique

        此注解配置在OrmTable的实现类的成员属性之上,表示这个字段的值在这张表中从不重复

      • @Default

        此注解配置在OrmTable的实现类的成员属性之上,通过它可以给字段指定默认值

  3. CRUD操作

    • 插入数据

      DaoFactory.getDao(Account::class.java).insert(Account(generateAccKey(),
                          "D"+generateAccKey(), "P"+generateAccKey()))
      

      insert不仅可以被用来插入单条数据,也可以插入一个List数据

    • 删除数据

      val selectOne = DaoFactory.getDao(Account::class.java)
                          .selectOne(QueryBuilder.create().orderBy(OrmTable.INDEX_ID))
                  if (selectOne != null) {
                      DaoFactory.getDao(Account::class.java).delete(selectOne)
                  }
      
    • 更新数据

      DaoFactory.getDao(Account::class.java).update(Account("这个是key",
                          "D"+generateAccKey(), "P"+generateAccKey()))
      
    • 查询数据

      • Condition

        selection:where子句,不带where,可以带”?“占位符

        selectionArgs:”?“占位符的所有值

      • WhereBuilder

        where子句的构建类,通过WhereBuilder.create ()创建实例

        public WhereBuilder addWhereEqualTo(String column, Object value) {
                return append(null, column + EQUAL_HOLDER, value);
            }
        

        可以通过调用addWhereEqualTo添加key=value条件。

      • QueryBuilder

        支持where、orderBy、limit、groupBy等

    • 查询记录数

      val count = DaoFactory.getDao(Account::class.java).selectCount()
      

      通过selectCount查询符合查询条件的记录条数。

  4. 其他注意事项

    • 复杂数据类型字段映射

      @Convert(converter = StringListConverter.class, columnType = String.class)
      @Column("acc_child_values")
      private List<String> accChildValues;
      

      使用@Convert注解可以保存复杂的数据类型,例如ArrayList,一般将复杂数据类型转成格式化后的字符串类型保存到数据库,读取数据的时候进行自动解码操作。converter类型转换器可以自行定义,columnType为你保存到数据库的实际数据类型。

    • 表结构升级

        @Override
        public boolean isUpgradeRecreated() {
            return false;
        }
      

      只需要在配置中将数据库版本提升1,即可自动进行表结构的升级。在OrmTable的实现类重写isUpgradeRecreated()来确定表升级后是否要清空之前保存的数据,如果return true,则在表升级后将数据清空。

    • 事务操作

      Transaction.execute(Account::class.java) {
                      val selectOne = 			it.selectOne(QueryBuilder.create().orderBy(OrmTable.INDEX_ID))
                      if (selectOne != null) {
                          it.delete(selectOne)
                      }
                  }
      

      使用Transaction.execute()可以在代码块中执行事务操作,it指代的是OrmDao<Account>。

转载自:https://juejin.cn/post/7139760822309355534
评论
请登录