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


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

来自天天博客: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一致.

时间: 2025-01-31 05:48:39

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

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

以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6020412.html [Android]Android端ORM框架--RapidORM(v2.1) RapidORM:Android端轻量高性能的ORM框架 GitHub: https://github.com/wangjiegulu/RapidORM RapidORM v2.1 feature 在执行SQL和创建表时提升性能. 提升bind参数时的性能 In

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

以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4748077.html    Android上主流的ORM框架有很多,常用的有ORMLite.GreenDao等. ORMLite: -优点:API很友好,使用比较方便简单稳定,相关功能比较完整. -缺点:内部使用反射实现,性能并不是很好. GreenDao: -优点:性能很不错, -缺点:API却不太友好,而且不支持复合主键,主键必须要有并且必须是long或者

Android 常用的ORM框架详解

1. OrmLite OrmLite 不是 Android 平台专用的ORM框架,它是Java ORM.支持JDBC连接,Spring以及Android平台.语法中广泛使用了注解(Annotation). 官方网站:http://ormlite.com/sqlite_java_android_orm.shtml 这个也是之前我在项目中 经常用到的,下面提供一个例子 新建一个User类 @SuppressWarnings("serial") @Entity(table="use

以全新方式获取商业资讯 云鸽发布企业头条V2.0

大数据技术的爆发让越来越多的企业重视到数据分析对企业的重要性,希望通过数据的分析.挖掘,为企业自身带来更行之有效.科学的决策.目前,面向企业管理者.职场人士,互联网数据分析提供商云鸽在线(北京)信息技术有限公司(以下简称云鸽在线)发布移动端应用企业头条V2.0,推出一款聚合企业资讯的专属平台.企业头条从大数据角度出发,为企业商务人士推荐个性化细分行业资讯,同时用户还可定制关注各类型企业,如自身.竞品.同 行.客户.供应商等相关信息. "移动互联网时代,企业存在大量的数据,我们希望把互联网数据带入

Android ORM 框架之 greenDAO

前言 我相信,在平时的开发过程中,大家一定会或多或少地接触到 SQLite.然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等.所以,适用于 Android 的ORM 框架也就孕育而生了,现在市面上主流的框架有 OrmLite.SugarORM.Active Android.Realm 与 GreenDAO.而今天的主角便是 greenDAO,下面,我将详解地介绍如何在 Android Studio 上使用 greenDAO,并结合代码总结一些使用过程中的心得.

Android 数据库ORM框架GreenDao学习心得及使用总结&lt;一&gt;

转: http://www.it165.net/pro/html/201401/9026.html   最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁的读写.查询等操作.因此首先想到了对整个项目的数据库框架进行优化. 原先使用android本身内置的sqllite,也就是用的最基本的SQLiteOpenHelper方法,这种方法对自己来说比较方便易懂.但是在使用过程中感觉很繁琐,从建表到对表的增删改查等操作,如果表对象的属性很多,就需要使用大量的

Android中使用开源框架eventbus3.0实现fragment之间的通信交互

1.概述 在之前的博文中简单介绍过如何实现fragment之间的信息交互:<Android中Fragment与Activity之间的交互(两种实现方式)>,今天继续给大家介绍一种可以实现此效果的另外一种方式EventBus.(相比于handler,接口回调,bundle传参,这个简单好用到哭) EventBus是Android下高效的发布/订阅事件的消息总线.作用是可以代替传统的Intent,Handler,Broadcast或接口函数在Fragment.Activity.Service.线程

2017 Android GitHub常用开源框架汇总

本文讲的是2017 Android GitHub常用开源框架汇总,现在 GitHub 上流行的开源库极大地节省了开发者从 0 开发的时间,很多公司和个人都在 GitHub 上开源自己的项目,今天我们就来整理一下 Android 开发中一些非常流行的库,也是我们必须掌握的,这样可以使我们在使用到时快速的查找到,这里的总结基本也都是自己在开发中用到的,也就是一些个人的见解,只做参考,不具有权威性 一.网络库 1. Retrofit Retrofit 是 Square 公司研发的网络请求库,也是目前

近乎推出移动端 V2.0,社区进入“微时代”

"微时代"顾名思义,最明显的特征就是"微".信息简短,即时性强,依赖于便携通讯设备.智能手机的普及程度不用说,这个小小的机器在短短几年内就渗透进我们生活的每个角落,而花样百出的手机应用就是吸引用户之源. 目前如腾讯.新浪.人人.豆瓣等社区网站都闻风而动推出了自己的手机移动客户端,作为SNS社区系统的代表,近乎今日也推出移动端V2.0,将社区完整带入"微时代". 即时通讯,想聊就聊 社区内部的交流是必不可少的,社区私信功能在手机上的实现,为用户提供