一、简介
1.Android ORM介绍
在平时的开发过程中,大家一定会或多或少地接触到 SQLite。然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等。所以,适用于 Android 的ORM 框架也就孕育而生了,现在市面上主流的框架有 OrmLite、SugarORM、Active Android、Realm 与 GreenDAO。下面先介绍下当前流行的5种ORM数据库框架:
1)OrmLite
OrmLite不是Android 平台专用的ORM框架,它是Java ORM。支持JDBC连接,Spring以及Android平台。语法中广泛使用了注解(Annotation)。
2)SugarORM
SugarORM是Android 平台专用ORM。提供简单易学的APIs。可以很容易的处理1对1和1对多的关系型数据,并通过3个函数save(), delete() 和 find() (或者 findById()) 来简化CRUD基本操作。
3)Active Android
Active Record(活动目录)是Yii、Rails等框架中对ORM实现的典型命名方式。Active Android 帮助你以面向对象的方式来操作SQLite。
4)Realm
Realm 是一个将可以使用的Android ORM,基于C++编写,直接运行在你的设备硬件上(不需要被解释),因此运行很快。它同时是开源跨平台的,iOS的代码可以在GitHub找到。
5)GreenDAO
GreenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。
2.GreenDao介绍及优点
介绍:
GreenDAO就是实现Java对象和SQLite Datebase的一个媒介人,简化了SQLite的操作,而且他的数据库操作效率非常高。可以帮助Android开发者快速将Java对象映射到SQLite数据库的表单中的ORM解决方案,通过使用一个简单的面向对象API,开发者可以对Java对象进行存储、更新、删除和查询。
官网网址:http://greenrobot.org/greendao/features//
优点:
1)最大性能(最快的Android ORM),GreenDAO 性能远远高于同类的 ORMLite(可见下图);
2)简易API,通过Java工程生成的类中方法全都自动写好了,可以直接调用;
3)高度优化,GreenDAO 支持 protocol buffer(protobuf) 协议数据的直接存储,如果你通过 protobuf 协议与服务器交互,将不需要任何的映射;与ORMLite等使用注解方式的ORM框架不同,greenDAO使用Code generation的方式,这也是其性能能大幅提升的原因。
4)最小内存消耗。
二、配置
配置Java工程
1)在Android Studio中选择File -> New -> New Module -> Java Library建立GreenDAO Generate工程;并且在该工程build.gradlew里添加以下依赖:
compile 'org.greenrobot:greendao-generator:2.2.0'
2)在新建的Java工程中新建一个Java类,该Java类用于生成项目所需的Bean、DAO等文件,以下是该类需要写的代码:
public class ExampleDaoGenerator {
public static void main(String[] args) throws Exception {
// 创建了一个用于添加实体(Bean)的模式(Schema)对象。
// 两个参数分别代表:数据库版本号与自动生成代码的包路径。
Schema schema = new Schema(1, "com.example.jianglei.greendaotestdemo.db.bean");
// 也可以分别指定生成的 Bean 与 DAO 类所在的目录
schema.setDefaultJavaPackageDao("com.example.jianglei.greendaotestdemo.db.dao");
//通过次Schema对象添加的所有实体都不会覆盖自定义的代码
// schema.enableKeepSectionsByDefault();
// 创建Schema对象后,就可以使用它添加实体(Bean)了。
addUser(schema);
// 最后使用 DAOGenerator 类的 generateAll()方法自动生成代码,根据自己的情况更改输出目录
new DaoGenerator().generateAll(schema,
"D:\\WorkSpace_01\\GreenDaoTestDemo\\app\\src\\main\\java");
}
/**
* @param schema
*/
private static void addUser(Schema schema) {
// 一个实体(类)就关联到数据库中的一张表,此处表名为「User」
Entity note = schema.addEntity("User");
// 也可以重新给表命名
// note.setTableName("NODE");
//单独让某个实体不覆盖自定义的代码
// note.setHasKeepSections(true);
// greenDAO 会自动根据实体类的属性值来创建表字段,并赋予默认值
note.addIdProperty().notNull().primaryKey();
note.addStringProperty("name").notNull();
// 与在 Java 中使用驼峰命名法不同,默认数据库中的命名是使用大写和下划线来分割单词的。
note.addIntProperty("age").notNull();
}
}
完成该类的编写后,点击Run来执行这个类可以看到:
三、工作原理
四个核心类的功能体系及工作原理如下图所示:
DaoMaster:
一看名字就知道它是Dao中的最大的官了。它保存了sqlitedatebase对象以及操作DAO classes(注意:不是对象)。其提供了一些创建和删除table的静态方法,其内部类OpenHelper和DevOpenHelper实现了SQLiteOpenHelper并创建数据库的框架。
public class DaoMaster extends AbstractDaoMaster {
public static final int SCHEMA_VERSION = 1;
/** Creates underlying database table using DAOs. */
public static void createAllTables(SQLiteDatabase db, boolean ifNotExists) {
UserDao.createTable(db, ifNotExists);
}
/** Drops underlying database table using DAOs. */
public static void dropAllTables(SQLiteDatabase db, boolean ifExists) {
UserDao.dropTable(db, ifExists);
}
public static abstract class OpenHelper extends SQLiteOpenHelper {
public OpenHelper(Context context, String name, CursorFactory factory) {
super(context, name, factory, SCHEMA_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION);
createAllTables(db, false);
}
}
/** WARNING: Drops all table on Upgrade! Use only during development. */
public static class DevOpenHelper extends OpenHelper {
public DevOpenHelper(Context context, String name, CursorFactory factory) {
super(context, name, factory);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
dropAllTables(db, true);
onCreate(db);
}
}
public DaoMaster(SQLiteDatabase db) {
super(db, SCHEMA_VERSION);
registerDaoClass(UserDao.class);
}
public DaoSession newSession() {
return new DaoSession(db, IdentityScopeType.Session, daoConfigMap);
}
public DaoSession newSession(IdentityScopeType type) {
return new DaoSession(db, type, daoConfigMap);
}
}
从DaoMast