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

创建好的Java工程如下图,包名和类名随意命名,但类名不要写DaoGenerator,因为这是系统的类名

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

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

博主的daogenerator工程的build.gradle文件如下:

(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()的做法完全没有必要

接着就要创建表结构了,一个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工程,本例中生成的结果如下:

(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

更多相关文章

  1. android 如何依赖android:sharedUserId更换皮肤Skin
  2. Android系统权限和root权限
  3. 【Android】Android(安卓)SDK下载和更新失败的解决方法!!!
  4. 【Android(安卓)系统开发】 编译 Android文件系统 u-boot 内核
  5. [Android(安卓)Studio] Android(安卓)studio 多渠道打包(超简洁
  6. 彻底解决Android(安卓)应用方法数不能超过65K的问题
  7. android google map apiKey 相关操作
  8. Android(安卓)studio开发找不到HttpClient问题
  9. android google map key申请

随机推荐

  1. [原]jQuery Tab插件,用于在Tab中显示ifram
  2. 利用jQuery的$.event.fix函数统一浏览器e
  3. 如何在Ajax.ActionLink中获取表单中的输
  4. jQuery -添加活动类并在单击时从其他元素
  5. 在页面问题内的Phonegap垂直滚动
  6. jquery 半透明遮罩效果 小结
  7. 将ISO-8859-1转换为UTF-8 [重复]
  8. jQueryValidate的js效果出不来需要注意的
  9. 如何检测“:”之前的单词并使用jquery进
  10. 当使用Javascript选择其中一个时,如何禁用