Android ORM框架GreenDao用法

时间:2022-01-17 15:26:38

Android ORM框架GreenDao用法

0 简介

android 上的ORM框架主要有两个:ormlite 和 GreenDAO,本篇主要介绍GreenDao的用法,原因是GreenDAO的速度快,关于ormlite和GreenDao的性能对比,请看这篇文章:[http://www.open-open.com/lib/view/open1438065400878.html][1]
GreenDao的Github地址: [https://github.com/greenrobot/greenDAO][2]

1 原理

GreenDAO之所以比ormlite快,是因为ormlite采用注解和反射,greenDao采用预先生成好的Java类,一般用了反射速度就会慢,但是greenDao的缺点就是没有ormlite易用,ormlite上手更快,更灵活。GreenDao实际上是用一些比封装的比较完善的类,就像Android提供的OpenHelper一样的,但是由于每个人的表结构都不一样,所以这些类必须动态生成,但是我们无法写出这些类,因此作者就创建了一个模板这个模板就是DaoGenerator,这是一个java工程,在使用之前必须先搭建这个工程,然后生成DaoMaster等类,然后就能大显身手了。
总结一下,使用GreenDao分三步

  • 创建Java工程Daogenerator
  • 生成DaoMaster、DaoSession、表对应实体类
  • 使用生成的类方便的操作数据库

2 创建Java工程

(1) 在AndroidStudio中创建新的module,点击Fiel–>new module–>选择Java Libary
Android ORM框架GreenDao用法
创建好的Java工程如下图,包名和类名随意命名,但类名不要写DaoGenerator,因为这是系统的类名
Android ORM框架GreenDao用法

(2) 在Java工程的build.gradle文件中引入GreenDaoGenerator

compile 'de.greenrobot:greendao-generator:2.0.0'

博主的daogenerator工程的build.gradle文件如下:
Android ORM框架GreenDao用法

(3) 编写定制属于我们的Dao文件生成器,在里面定义我们的数据库名称,表结构,表的依赖关系,当然全都是面向对象的操作,不涉及到SQL语句,GreenDAO都帮我们封装好了,在生成的具体文件中就会看见SQL语句,这里主要参考这篇文章:http://my.oschina.net/cheneywangc/blog/196354
如果表的结构发生变化,即Dao文件的属性发生变化,那么必须修改Dao生成文件,然后重新生成相应的文件
本例中MyDaoGenerator的代码如下:

/**
* GreenDao的实体类生成器
*/

public class MyDaoGenerator {

public static void main(String[] args) {
//指定数据库版本号,以及自动生成代码的包路径
Schema schema = new Schema(1, "com.hello1.model");
//添加属性
addNote(schema);
//设置自动生成的代码的生成路径
try {
new DaoGenerator().generateAll(schema, "./app/src/main/java");
} catch (Exception e) {
e.printStackTrace();
}
}

//添加数据库实体类
public static void addNote(Schema schema) {
//一个实体类对于数据库的一张表
Entity note = schema.addEntity("Note");
//接下来你便可以设置表中的字段,greenDAO 会自动根据实体类的属性值来创建表字段,并赋予默认值
note.addIdProperty().autoincrement();
note.addStringProperty("text").notNull();
note.addShortProperty("content");
note.addDateProperty("date");
}
}

下面具体讲解:

Schema schema = new Schema(1, “com.hello1.model”);

首先创建Schema,第一个参数是数据库的版本号,第二个参数是指定生成的文件放在Android工程的哪个包下面,这里”com.hello1.model”是我的Android工程app的包路径,因为最终这些生成的文件是要我们用在Android中的
关于网上说的必须要在Android工程中新建一个src-gen目录,然后在build.gradle文件中配置source dir()的做法完全没有必要
Android ORM框架GreenDao用法

接着就要创建表结构了,一个Entity就是一个表,下面的代码定义了建表的过程,虽然全部采用了面向对象的简表过程,但还是还要一定的SQL基础,否则从基本的表的结构,外键到用E-R图设计表结构都是需要数据库知识的,涉及到的多表查询,一对一,一对多的关系更是复杂

Entity note = schema.addEntity(“Note”);
note.addIdProperty().autoincrement();
note.addStringProperty(“text”).notNull();
note.addShortProperty(“content”);
note.addDateProperty(“date”);

3 在Android工程中使用GreenDAO

(1) 运行我们创建的Java工程,本例中生成的结果如下:
Android ORM框架GreenDao用法

(2) 在Android工程(本例中就是app)中的build.gradle文件引入下面代码:

compile ‘de.greenrobot:greendao:2.0.0’

(3) MainActivity代码如下,布局文件只有2个按钮

private DaoMaster.DevOpenHelper helper;
private SQLiteDatabase db;
private DaoMaster daoMaster;
private DaoSession daoSession;
private NoteDao noteDao;
private Button btnTest;
private Button btnTest2;
private TextView tvShow;
private long count = 0;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.btnTest = (Button) findViewById(R.id.btn_test);
this.btnTest2 = (Button) findViewById(R.id.btn_test_2);
this.tvShow = (TextView) findViewById(R.id.tv_show);
//创建数据库
this.helper = new DaoMaster.DevOpenHelper(this, "test_db", null);
this.db = helper.getWritableDatabase();
this.daoMaster = new DaoMaster(db);
this.daoSession = daoMaster.newSession();
this.noteDao = daoSession.getNoteDao();
this.btnTest.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
count++;
Note note = new Note();
note.setContent((short) count);
note.setText("测试数据,id = " + count);
note.setDate(new Date());
//插入数据
noteDao.insert(note);
}
});
this.btnTest2.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
//取出所有数据
List data = noteDao.queryBuilder().list();
if (data == null) {
tvShow.setText("木有数据");
return;
}
StringBuilder builder = new StringBuilder();
for (int i = 0; i < data.size(); i++) {
Note note = (Note) data.get(i);
builder.append(String.format("%d %s %s\n",note.getId(),note.getText(),note.getDate().toString()));
}
tvShow.setText(builder.toString());
}
});

}

(3) 以dao结尾的类才是操作数据库的类,得到NoteDao之后,现在就可以开心的使用GreenDAO了,具体的查询等方法可参考官方文档:http://greendao-orm.com/documentation

4 总结

(1) GreenDAO比ormlite快,但是配置麻烦,还要额外的工程,而且每次创建表都很麻烦,没有ormlite的注解来的快,尤其是自己写JavaBean还要和Entity相互转换一下,也就是已经写好的JavaBean不能直接转化数据库实体类,好处就是建表的时候更加明显,注解就比较随意,像依赖关系,外键等,使用注解就不明显

5 转载请注明来自梧桐那时雨的博客:http://blog.csdn.net/fuchaosz/article/details/50225287