一、什么是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的运行效率高,内存消耗少,包大小也教小,容易使用和阅读,推荐使用,也值得学习和借鉴!