博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Android]Android端ORM框架——RapidORM(v2.0)
阅读量:6872 次
发布时间:2019-06-26

本文共 10277 字,大约阅读时间需要 34 分钟。

以下内容为原创,欢迎转载,转载请注明

来自天天博客:

[Android]Android端ORM框架——RapidORM(v2.0)

:Android端轻量高性能的ORM框架

GitHub: https://github.com/wangjiegulu/RapidORM

1. RapidORM v1.0

v1.0博客文档:

v1.0版本支持使用反射和非反射(模版生成)两种方式实现执行SQL。

1.1. v1.0缺点:

  1. 其中默认为反射实现,对性能有一定的影响。

  2. 而如果要采用非反射实现,则需要使用RapidORM提供的模版工具类手动生成相关的帮助类,当数据表需要修改时,必须要手动手动生成帮助类,有潜在的风险。

  3. 非反射时生成的文件是通过getter/setter方法调用的,但是getter/setter方法名可能会不一致,导致需要手动调整setter/getter方法名称。

2. RapidORM v2.0

相比较于v1.0版本,v2.0版本则更加侧重于非反射操作,所有默认都是非反射的。

通过在编译时期根据@Table@Column等注解自动生成辅助类Xxx_RORM.java文件,RapidORM库会使用这些生成的辅助类来进行数据表的初始化、执行SQL等操作,如果数据表有结构有改动,则会自动重新生成或者rebuild来手动生成。

2.1 v2.0 使用指南

v1.0相同部分省略。

2.1.1 同样,创建持久类Person

/** * Author: wangjie * Email: tiantian.china.2@gmail.com * Date: 6/25/15. */@Tablepublic class Person implements Serializable {    @Column(primaryKey = true)    Integer id;    @Column(primaryKey = true, name = "type_id")    Integer typeId;    @Column    String name;    @Column    int age;    @Column    String address;    @Column    Long birth;    @Column    Boolean student;    @Column(name = "is_succeed")    boolean isSucceed;        // getter/setter    }

注意,v2.0版本不支持变量为private类型,这是为了避免使用getter/setter方法来进行数据绑定。如果变量为private类型,则编译会报错,如下:

Error:Execution failed for task ':example:compileDebugJavaWithJavac'.> java.lang.RuntimeException: id in com.wangjie.rapidorm.example.database.model.Person can not be private!

2.1.2 Rebuild Project

Android Studio -> Build -> Rebuild Project

Build成功后,在主项目build/generated/source/apt/目录下会生成Person_RORM类, 如下:

// GENERATED CODE BY RapidORM. DO NOT MODIFY! "2016-06-29 14:08:504", Source table: "com.wangjie.rapidorm.example.database.model.Person"package com.wangjie.rapidorm.example.database.model;import android.database.Cursor;import com.wangjie.rapidorm.core.config.ColumnConfig;import com.wangjie.rapidorm.core.config.TableConfig;import java.util.List;public class Person_RORM extends TableConfig
{ /** * Column name: "id", field name: {@link Person#id} */ public static final String ID = "id"; /** * Column name: "type_id", field name: {@link Person#typeId} */ public static final String TYPE_ID = "type_id"; /** * Column name: "name", field name: {@link Person#name} */ public static final String NAME = "name"; /** * Column name: "age", field name: {@link Person#age} */ public static final String AGE = "age"; /** * Column name: "address", field name: {@link Person#address} */ public static final String ADDRESS = "address"; /** * Column name: "birth", field name: {@link Person#birth} */ public static final String BIRTH = "birth"; /** * Column name: "student", field name: {@link Person#student} */ public static final String STUDENT = "student"; /** * Column name: "is_succeed", field name: {@link Person#isSucceed} */ public static final String IS_SUCCEED = "is_succeed"; public Person_RORM() { super(Person.class); } @Override protected void parseAllConfigs() { tableName = "Person"; ColumnConfig idColumnConfig = buildColumnConfig("id"/*column name*/, false/*autoincrement*/, false/*notNull*/, ""/*defaultValue*/, false/*index*/, false/*unique*/, false/*uniqueCombo*/, true/*primaryKey*/, "INTEGER"/*dbType*/); allColumnConfigs.add(idColumnConfig); allFieldColumnConfigMapper.put("id"/*field name*/, idColumnConfig); pkColumnConfigs.add(idColumnConfig); ColumnConfig typeIdColumnConfig = buildColumnConfig("type_id"/*column name*/, false/*autoincrement*/, false/*notNull*/, ""/*defaultValue*/, false/*index*/, false/*unique*/, false/*uniqueCombo*/, true/*primaryKey*/, "INTEGER"/*dbType*/); allColumnConfigs.add(typeIdColumnConfig); allFieldColumnConfigMapper.put("typeId"/*field name*/, typeIdColumnConfig); pkColumnConfigs.add(typeIdColumnConfig); ColumnConfig nameColumnConfig = buildColumnConfig("name"/*column name*/, false/*autoincrement*/, false/*notNull*/, ""/*defaultValue*/, false/*index*/, false/*unique*/, false/*uniqueCombo*/, false/*primaryKey*/, "TEXT"/*dbType*/); allColumnConfigs.add(nameColumnConfig); allFieldColumnConfigMapper.put("name"/*field name*/, nameColumnConfig); noPkColumnConfigs.add(nameColumnConfig); ColumnConfig ageColumnConfig = buildColumnConfig("age"/*column name*/, false/*autoincrement*/, false/*notNull*/, ""/*defaultValue*/, false/*index*/, false/*unique*/, false/*uniqueCombo*/, false/*primaryKey*/, "INTEGER"/*dbType*/); allColumnConfigs.add(ageColumnConfig); allFieldColumnConfigMapper.put("age"/*field name*/, ageColumnConfig); noPkColumnConfigs.add(ageColumnConfig); ColumnConfig addressColumnConfig = buildColumnConfig("address"/*column name*/, false/*autoincrement*/, false/*notNull*/, ""/*defaultValue*/, false/*index*/, false/*unique*/, false/*uniqueCombo*/, false/*primaryKey*/, "TEXT"/*dbType*/); allColumnConfigs.add(addressColumnConfig); allFieldColumnConfigMapper.put("address"/*field name*/, addressColumnConfig); noPkColumnConfigs.add(addressColumnConfig); ColumnConfig birthColumnConfig = buildColumnConfig("birth"/*column name*/, false/*autoincrement*/, false/*notNull*/, ""/*defaultValue*/, false/*index*/, false/*unique*/, false/*uniqueCombo*/, false/*primaryKey*/, "LONG"/*dbType*/); allColumnConfigs.add(birthColumnConfig); allFieldColumnConfigMapper.put("birth"/*field name*/, birthColumnConfig); noPkColumnConfigs.add(birthColumnConfig); ColumnConfig studentColumnConfig = buildColumnConfig("student"/*column name*/, false/*autoincrement*/, false/*notNull*/, ""/*defaultValue*/, false/*index*/, false/*unique*/, false/*uniqueCombo*/, false/*primaryKey*/, "INTEGER"/*dbType*/); allColumnConfigs.add(studentColumnConfig); allFieldColumnConfigMapper.put("student"/*field name*/, studentColumnConfig); noPkColumnConfigs.add(studentColumnConfig); ColumnConfig isSucceedColumnConfig = buildColumnConfig("is_succeed"/*column name*/, false/*autoincrement*/, false/*notNull*/, ""/*defaultValue*/, false/*index*/, false/*unique*/, false/*uniqueCombo*/, false/*primaryKey*/, "INTEGER"/*dbType*/); allColumnConfigs.add(isSucceedColumnConfig); allFieldColumnConfigMapper.put("isSucceed"/*field name*/, isSucceedColumnConfig); noPkColumnConfigs.add(isSucceedColumnConfig); } @Override public void bindInsertArgs(Person model, List
insertArgs) { Integer id = model.id; insertArgs.add(null == id ? null : id ); Integer typeId = model.typeId; insertArgs.add(null == typeId ? null : typeId ); String name = model.name; insertArgs.add(null == name ? null : name ); int age = model.age; insertArgs.add(age); String address = model.address; insertArgs.add(null == address ? null : address ); Long birth = model.birth; insertArgs.add(null == birth ? null : birth ); Boolean student = model.student; insertArgs.add(null == student ? null : student ? 1 : 0); boolean isSucceed = model.isSucceed; insertArgs.add(isSucceed ? 1 : 0); } @Override public void bindUpdateArgs(Person model, List updateArgs) { String name = model.name; updateArgs.add(null == name ? null : name); int age = model.age; updateArgs.add(age); String address = model.address; updateArgs.add(null == address ? null : address); Long birth = model.birth; updateArgs.add(null == birth ? null : birth); Boolean student = model.student; updateArgs.add(null == student ? null : student ? 1 : 0); boolean isSucceed = model.isSucceed; updateArgs.add(isSucceed ? 1 : 0); } @Override public void bindPkArgs(Person model, List pkArgs) { Integer id = model.id; pkArgs.add(null == id ? null : id); Integer typeId = model.typeId; pkArgs.add(null == typeId ? null : typeId); } @Override public Person parseFromCursor(Cursor cursor) { Person model = new Person(); int index; index = cursor.getColumnIndex("id"); if(-1 != index) { model.id = cursor.isNull(index) ? null : (cursor.getInt(index)); } index = cursor.getColumnIndex("type_id"); if(-1 != index) { model.typeId = cursor.isNull(index) ? null : (cursor.getInt(index)); } index = cursor.getColumnIndex("name"); if(-1 != index) { model.name = cursor.isNull(index) ? null : (cursor.getString(index)); } index = cursor.getColumnIndex("age"); if(-1 != index) { model.age = cursor.isNull(index) ? null : (cursor.getInt(index)); } index = cursor.getColumnIndex("address"); if(-1 != index) { model.address = cursor.isNull(index) ? null : (cursor.getString(index)); } index = cursor.getColumnIndex("birth"); if(-1 != index) { model.birth = cursor.isNull(index) ? null : (cursor.getLong(index)); } index = cursor.getColumnIndex("student"); if(-1 != index) { model.student = cursor.isNull(index) ? null : (cursor.getInt(index) == 1); } index = cursor.getColumnIndex("is_succeed"); if(-1 != index) { model.isSucceed = cursor.isNull(index) ? null : (cursor.getInt(index) == 1); } return model; }}

2.1.3 注册持久类

v1.0一样,新建类DatabaseFactory,继承RapidORMConnection(可参考)。

需要注意的是需要实现的并不是原来的registerAllTableClass()方法,而是registerTableConfigMapper(HashMap<Class, TableConfig> tableConfigMapper)方法:

// ...@Overrideprotected void registerTableConfigMapper(HashMap
tableConfigMapper) { tableConfigMapper.put(Person.class, new Person_RORM()); // register all table config here...}// ...

注意:注册Person时,需要连带生成的Person_RORM同时注册。

2.1.4 构建Builder

构建Builder时与v1.0的方式一致,但是可以直接使用Person_RORM中的static变量来作为column name:

PersonDaoImpl:

public List
findPersonsByWhere() throws Exception { return queryBuilder() .addSelectColumn(Person_RORM.ID, Person_RORM.TYPE_ID, Person_RORM.NAME, Person_RORM.AGE, Person_RORM.BIRTH, Person_RORM.ADDRESS) .setWhere( Where.and( Where.like(Person_RORM.NAME, "%wangjie%"), Where.lt(Person_RORM.ID, 200), Where.or( Where.between(Person_RORM.AGE, 19, 39), Where.isNull(Person_RORM.ADDRESS) ), Where.eq(Person_RORM.TYPE_ID, 1) ) ) .addOrder(Person_RORM.ID, false) .addOrder(Person_RORM.NAME, true) .setLimit(10) .query(this);}

2.1.5 兼容SqlCipher

v1.0一致.

你可能感兴趣的文章
为什么企业不对 GPL 侵权采取法律行动
查看>>
《Spark大数据分析实战》——第1章Spark简介
查看>>
以黑客教主之名,TK 发现 Windows 史上最大漏洞
查看>>
《IPv6精髓(第2版)》——导读
查看>>
《Windows Server 2012 Hyper-V虚拟化管理实践》一1.2 Hyper-V安装前后的变化
查看>>
Proxmox VE 4.4 发布,新 Ceph 仪表盘上线
查看>>
《CCNP TSHOOT(642-832)学习指南》一1.2 维护进程及维护流程
查看>>
华为宣布开源流处理平台查询语言 StreamCQL
查看>>
2016 年 6 月 RedMonk 编程语言排行榜
查看>>
《Adobe Photoshop CC经典教程(彩色版)》—第1课1.4节在Photoshop中还原操作
查看>>
HttpClient使用详解
查看>>
增强现实?先不要指望那些眼镜了
查看>>
《iOS 6核心开发手册(第4版)》——1.10节秘诀:使用多触摸交互
查看>>
《云数据管理:挑战与机遇》一第1章
查看>>
《嵌入式C编程实战》——1.5 软件开发工具
查看>>
分析3000份技术面试数据:这几大指标比你毕业于哪所学校更要紧
查看>>
Linux有问必答:如何检查PDF中使用了哪种字体
查看>>
《Lua游戏AI开发指南》一2.1 新建一个沙箱项目
查看>>
对jquery val 获取input 文本框值进行扩展
查看>>
MySQL (select_paren) union_order_or_limit 行为
查看>>