一、什么是ORM?
ORM是object relation mapping的缩写,即对象关系映射,简单的说就是对象模型和关系模型的一种映射。ORM基于三个核心原则,简单:以最基本的形式建模数据;传达性:数据库结构被任何人都能理解的语言文档化;精确性:基于数据模型创建正确标准化的结构。

二、为什么要有这么一个映射?
很简单,因为我们的开发语言通常是面向对象的,但是传统的数据库却是关系型的。为了可以贴近面向对象开发,我们想要像操作对象一样操作数据库,使程序开发更加简单易懂。

三、ORM框架在Android中的应用
在Android中,操作本地数据库的方法有多种,SQL语句、ContentProvider或者ORM型库。目前,ORM框架有多个选择:
1、ORMLite ,它不是Android平台专用的ORM框架,供Java平台用。特点是通过在类上添加注解设置类,支持MySQL, SQL Server, Sqlite等数据库,且可以扩展其他数据库。支持基本的数据库事务,自动生成创建和删除SQL语句。
2、androidorm,实现数据库与java对象之间的映射转换,可自动更新数据库结构,支持sql直接操作,包括取对象列表。明显缺点是不支持数据之间的关联查询,它的更新速度也教慢。
3、ActiveAndroid,实现数据库与java对象之间的映射转换,增加属性时自动更新数据库结构而不影响数据,支持onetomany。它的明显不足是,由于大量用到反射,代码中很多对象不能被混淆,并且对注解也有一定的要求。
4、greenDAO、由于greenDAO没由使用反射,所以它的性能很高,执行数据库的速度教好。它能够支持数千条记录的CRUD每秒,比其他框架的性能要好很多,并且它的size较小,所以对应用程序APK的包大小影响非常小。
下面我们就看看表现比较好的greenDAO吧。

四、项目中如何使用greenDAO?
与 ORMLite 等使用注解方式的 ORM 框架不同,greenDAO主要使用Code generation的方式,这也是其性能能大幅提升的原因。我们需要建一个Java Project,用于自动生成后继 Android 工程中需要使用到的 Bean、DAO、DaoMaster、DaoSession 等类。
1、配置greenDAO生成代码的包。
在 .src/main 目录下新建一个与 java 同层级的「java-gen」目录,用于存放由 greenDAO 生成的各种类。然后在build.gradle中添加依赖。

compile 'de.greenrobot:greendao:1.3.+'
sourceSets {
    main {
        java.srcDirs = ['src/main/java', 'src/main/java-gen']
    }
}

2、新建java generator library
新建一个java library工程,在build.gradle里添加依赖。

compile 'de.greenrobot:greendao-generator:1.3.+'

编写DaoGenerator 类

public class SimpleDaoGenerator {
    public static void main(String[] args) throws Exception {
        // 创建一个用于添加实体(Entity)的对象。
        // 参数代表数据库版本号与包名。
        Schema schema = new Schema(1, "com.simple.greendao");

        // 拥有了Schema 对象后,就可以使用它添加实体(Entity)了。
        addEntity(schema);

        // 由generateAll()方法自动生成代码,path代表路径
        new DaoGenerator().generateAll(schema, path + "/MyGreenDAO/app/src/main/java-gen");
    }

    /**
     * 添加实体,也就是给数据库添加表和字段。
     */
    private static void addEntity(Schema schema) {
        // 一个实体关联一个表,表名为Note
        Entity note = schema.addEntity("Student");
        // 设置表中的字段:
        note.addIdProperty();
        note.addStringProperty("name").notNull();
        // 与在 Java 中使用驼峰命名法不同,默认数据库中的命名是使用大写和下划线来分割单词的。
        // For example, a property called “creationDate” will become a database column “CREATION_DATE”.
        note.addDateProperty("birthday");
    }
}

执行java工程,就会在主工程「java-gen」下自动生成了DaoMaster、DaoSession、NoteDao、Note共4个类文件。

3、使用greenDAO对数据库的增删改查操作
第一步,初始花DaoMaster和DaoSession

DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "my-db", null);
db = helper.getWritableDatabase();
// 该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
DaoMaster daoMaster = new DaoMaster(db);
DaoSession daoSession = daoMaster.newSession();

第二步,

/**
     * 获取可读数据库
     */
    private SQLiteDatabase getReadableDatabase() {
        SQLiteDatabase db = helper.getReadableDatabase();
        return db;
    }
/**
     * 获取可写数据库
     */
    private SQLiteDatabase getWritableDatabase() {
        SQLiteDatabase db = helper.getWritableDatabase();
        return db;
    }
/**
 * 插入一条记录
 */
public void insertUser(User user) {
    UserDao userDao = daoSession.getUserDao();
    userDao.insert(user);
}

/**
 * 插入用户集合
 */
public void insertUserList(List<User> users) {
    UserDao userDao = daoSession.getUserDao();
    userDao.insertInTx(users);
}
/**
 * 删除一条记录
 */
public void deleteUser(User user) {
    UserDao userDao = daoSession.getUserDao();
    userDao.delete(user);
}
/**
 * 更新一条记录
 */
public void updateUser(User user) {
    UserDao userDao = daoSession.getUserDao();
    userDao.update(user);
}
/**
 * 查询用户列表
 */
public List<User> queryUserList() {
    UserDao userDao = daoSession.getUserDao();
    QueryBuilder<User> qb = userDao.queryBuilder();
    List<User> list = qb.list();
    return list;
}

/**
 * 查询用户列表
 */
public List<User> queryUserList(int age) {
    UserDao userDao = daoSession.getUserDao();
    QueryBuilder<User> qb = userDao.queryBuilder();
    qb.where(UserDao.Properties.Age.gt(age)).orderAsc(UserDao.Properties.Id);
    List<User> list = qb.list();
    return list;
}
/** 
 * 插入或更新数据支持事务处理 
 */  
public void updateUserList(final List<User> list){ 
        UserDao userDao = daoSession.getUserDao(); 
        daoSession.runInTx(new Runnable() {  
        @Override  
        public void run() {  
            for(int i=0; i<list.size(); i++){  
                User user = list.get(i);  
                userDao.insertOrReplace(user);  
            }  
        }  
    });  
}

总结一下,greenDAO的运行效率高,内存消耗少,包大小也教小,容易使用和阅读,推荐使用,也值得学习和借鉴!