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

来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5626716.html

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

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

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

1. RapidORM v1.0

v1.0博客文档:http://www.cnblogs.com/tiantianbyconan/p/4748077.html

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.
*/
@Table
public 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<Person> {
/**
* 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<Object> 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<Object> 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<Object> 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(可参考http://www.cnblogs.com/tiantianbyconan/p/4748077.html)。

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

// ...
@Override
protected void registerTableConfigMapper(HashMap<Class, TableConfig> 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<Person> 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一致.

[Android]Android端ORM框架——RapidORM(v2.0)的更多相关文章

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

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6020412.html [Android]Android端ORM ...

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

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4748077.html  Android上主流的ORM框架有很多 ...

  3. ORM框架--GreenDao 3.0基本使用指南

    0. ORM框架--GreenDao 3.0基本使用指南 1. Gradle 的配置 这里可以参照官方的文档进行最新的配置(本示例的版本等你看到可能就不是最新的了),但是值得注意的一点是,GreenD ...

  4. Android 常用的ORM框架详解

    1. OrmLite OrmLite 不是 Android 平台专用的ORM框架,它是Java ORM.支持JDBC连接,Spring以及Android平台.语法中广泛使用了注解(Annotation ...

  5. .NET 开源SqlServer ORM框架 SqlSugar 3.0 API

    3.1.x ,将作为3.X系统的最后一个版本,下面将会开发 全新的功能 更新列表:https://github.com/sunkaixuan/SqlSugar/releases 优点: SqlSuga ...

  6. android中的http框架,使其更加简单易用

    Afinal 是一个android的sqlite orm 和 ioc 框架. Afinal 是一个android的sqlite orm 和 ioc 框架.同时封装了android中的http框架,使其 ...

  7. ThinkAndroid是简洁,快速的进行Android应用程序的框架

    ThinkAndroid简介ThinkAndroid是一个免费的开源的.简易的.遵循Apache2开源协议发布的Android开发框架,其开发宗旨是简单.快速的进行Android应用程序的开发,包含A ...

  8. .NET ORM框架 SqlSuagr4.0 功能详解与实践【开源】

    SqlSugar 4.0 ORM框架的优势 为了未来能够更好的支持多库分布式的存储,并行计算等功能,将SqlSugar3.x全部重写,现有的架构可以轻松扩展多库. 源码下载: https://gith ...

  9. .NET ORM框架 SqlSugar4.0 功能快速预览【开源】

    SqlSugar 4.0 ORM框架的优势 为了未来能够更好的支持多库分布式的存储,并行计算等功能,将SqlSugar3.x全部重写,现有的架构可以轻松扩展多库. 源码下载: https://gith ...

随机推荐

  1. SSD框架训练自己的数据集

    SSD demo中详细介绍了如何在VOC数据集上使用SSD进行物体检测的训练和验证.本文介绍如何使用SSD实现对自己数据集的训练和验证过程,内容包括: 1 数据集的标注2 数据集的转换3 使用SSD如 ...

  2. 进程监控工具supervisor 启动Mongodb

    进程监控工具supervisor 启动Mongodb 一什么是supervisor Superviosr是一个UNIX-like系统上的进程监控工具. Supervisor是一个Python开发的cl ...

  3. Windbg Extension NetExt 使用指南 【2】 ---- NetExt 的基本命令介绍

    摘要 : 本章节介绍NetExt常用的命令. 并且对SOS进行一些对比. NetExt的帮助 要想玩好NetExt, 入门就得看帮助. 看NetExt的帮助可以调用!whelp 命令. 这样hi列举出 ...

  4. WCF : 修复 Security settings for this service require Windows Authentication but it is not enabled for the IIS application that hosts this service 问题

    摘要 : 最近遇到了一个奇怪的 WCF 安全配置问题, WCF Service 上面配置了Windows Authentication. IIS上也启用了 Windows Authentication ...

  5. 一种简单,轻量,灵活的C#对象转Json对象的方案

    简单,是因为只有一个类 轻量,是因为整个类代码只有300行 灵活,是因为扩展方式只需要继承重写某个方法即可 补充:修正无法处理可空值类型的bug 首先我将这个类称之为JsonBuilder,我希望它以 ...

  6. 跟我一起ggplot2(1)

    ggplot2 R的作图工具包,可以使用非常简单的语句实现非常复杂漂亮的效果. qplot 加载qplot library(ggplot2) # 测试数据集,ggplot2内置的钻石数据 qplot( ...

  7. 实现ABP中Person类的权限功能

    菜单项的显示功能已经完全OK了.那么我们就开始制作视图功能吧. 首先测试接口是否正常 我们通过代码生成器将权限和application中大部分功能已经实现了.那么我们来测试下这些接口ok不. 浏览/a ...

  8. ABP框架 - 应用服务

    文档目录 本节内容: IApplicationService 接口 ApplicationService 类 CrudAppService 和 AsyncCrudAppService 类 简单的CRU ...

  9. ILMerge合并多个DLL

    序言 如果你的项目要提供多个dll给别人用,那么不妨让你的dll合并为一个,让别人看起来简洁,引用起来不会过于繁琐. 本篇比较少,但也算是比较实用吧. 下载微软的辅助工具ILMerge Imerge下 ...

  10. 【.NET深呼吸】基础:自定义类型转换

    照例,老周在开始吹牛之前,先讲讲小故事,这是朋友提出的建议,老TMD写技术有什么了不起的,人人都会写.后来老周想想,也确实,代码谁不会写,能写到有品位有感悟,就不容易做到.于是,老周接受了该朋友的建议 ...