一、背景知识
ORM(Object Relation Mapping):对象关系模型。用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。ORM作为项目中间件形式实现数据在不同场景下数据关系映射,对象关系映射是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。
Android常用几个ORM框架:ORMLite、GreenDao、ormndroid、androrm等。ORMLite和GreenDao的比较:
- ORMLite:文档全面,社区活跃,维护良好,使用简单,容易上手,但是因为基于反射,所效率较低
- GreenDao:使用code generation,效率很高;库文件较小(约87KB),占用更少内存, 缺点是学习成本较高,需要弄清楚其原理才能方便使用
二、原理简介
GreenDao向SQLite数据库提供了一个对象导向的接口,它为用户省下了很多重复的工作,而且提供了简便的操作接口。
为了使用GreenDao,需要在新建一个Java工程(工程中需要导入greendao-generator-x.x.x.jar,freemarker-x.x.xx.jar),根据GreenDao的规则在其中描述数据库的表结构,运行之后它会构建你的实体模型和DAO工具类。具体包括:
DaoMaster:
- 持有数据库对象(SQLiteDatabase) ,并管理一些DAO类(不是对象)
- 能够创建和删除数据库表
- 它的内部类OpenHelper和DevOpenHelper是SQLiteOpenHelper的实现类,用于创建SQLite数据库的模式
DaoSession:
- 管理制定模式下所有可用的DAO对象
- 能对实体进行插入、加载、更新、刷新、删除操作。
DAO:
- 每个实体都有一个DAO,相对于DaoSession,它有更多的方法,比如:加载全部、InsertTx
Entity
- 可持久化的对象,由generator 生成。相当于数据库中的一张表,所有字段都是使用标准的Java对象的属性(比诶)
通过generator生成的这些工具类,你就可以在自己的Android工程中对进行数据库操作,完全不需要写任何SQL语句。
三、建表
数据库建立:在应用中通过DaoMaster的DevOpenHelper完成。
Schema schema = new Schema(1000, "de.greenrobot.daoexample");
Entity note = schema.addEntity("Note");
note.addIdProperty().primaryKey().autoincrement();
note.addStringProperty("text").notNull();
note.addStringProperty("comment");
note.addDateProperty("date");
注:在生成的实体类中,int类型会自动转为long类型
dao.setTableName("NoteList");
greenDAO会自动根据实体类属性创建表字段,并赋予默认值。例如在数据库方面的表名和列名都来源于实体类名和属性名。默认的数据库名称是大写使用下划线分隔单词,而不是在Java中使用的驼峰式大小写风格。例如,一个名为“CREATIONDATE”属性将成为一个数据库列“CREATION_DATE”。
在使用greenDAO时,一个实体类只能对应一个表,目前没法做到一个表对应多个实体类,或者多个表共用一种对象类型。后续的升级也不会针对这一点进行扩展。
四、表的增删改查
1.查询:
(1)QueryBuilder:
普通用法:
List joes = userDao.queryBuilder()
.where(Properties.FirstName.eq("Joe"))
.orderAsc(Properties.LastName)
.list();
嵌套情况:(查询1970年9月之后出生的用户)
QueryBuilder qb = userDao.queryBuilder();