简介
greendao的本质是为存储在关系型数据库sqlite中的数据提供一个对象导向型的接口,只需要定义好数据的model类,然后greendao就会创建一个java对象和数据访问对象。这将会少写很多无聊的把数据折腾来折腾去的代码。更屌的是,greendao还提供了一些灰常牛逼的orm特性,像查询会话缓存、预加载和活动实体。
在现存的所有的orm中,greendao是最快的,我们greendao表现最完美。速度才是数据库存取数据的王道,使用greendao,大多数的对象实体可以以一秒钟几千个的速度被插入和修改。
我们对greendao的表现很自信,不服你可以拿其他的orm和我们比对。我们开源了测试标准,完全透明。下面的图比较了现在最流行的(主要是根据github上的星数和Appbrain的数据)三种android的orm解决方案——OrmLite、ActiveAndroid以及我们的greendao。greendao在插入和修改实体的时候比ORMLite大约快两倍,在加载实体的时候大约比ORMLite快四倍。
除了这些,greendao在查询会话缓存和智能预加载的技术上有额外的加速表现哦。
在加密支持方面,你可以在安卓内置的标准的sqlite上使用greendao,也可以和
SQLCipher搭配使用。
“苗条的”库文件:greendao的核心库还不到100K,所有添加上去不会让你的APK变得臃肿。
活动实体:如果你高兴,你可以把实体做成“活动”的,活动的实体可以清晰地解析数据关系(你只需要调用getter函数就OK了),对于数据持久化,它还有修改、删除、刷新的方法,都很方便。
协议缓冲支持:如果你通过协议缓冲和你的服务器交互的话,你就不需要其他的映射了。对于协议缓冲对象来说,所有的常规实体类的持久化操作都是可用的。我们相信这个是我们牛逼的greendao的一个独特的特性。
代码生成:greendao将会生成java对象(实体)和数据访问对象的对象。DAO的对象针对实体,生成最合适的映射。未来的计划:到时候可以搞一些适配器,获取有可能是增删改查的activity。
开源:greendao的开源代码在github上完全可见,其中包括了使用率greendao的各种特性的JUnit单元测试,因此它也是学习greendao的一个好途径。
Demo
如何启动
这篇使用指导将会带你完成一个简单的greendao的样本工程——DaoExample,请任性地去下载代码并运行它,或者你也可以直接在github上看相关文件。
DaoExample 是一个简单的记事本APP,你可以添加记事,也可以通过点击已经存在的
笔记来删除它。
Note实体和DAO类:让我们直接去看代码吧,在src的文件夹里面你会看到一个记事本的
实体类,Note.java,它会持久化到数据库中,并且会包含一个笔记的所有数据,比
如一个ID,笔记正文和创建日期。
一般而言,一个实体就是一个类,这个类能持久化于数据库中(也就是表中的一条记
录)。一个实体包含若干个属性,这些属性和数据库里面的某一列呈映射关系。
现在开整项目,举个栗子,使用AS里面的“Build > Make project”,然后就会使
greendao生成DAO的类文件,比如像NoteDao.java这样的,这些将帮助你添加笔记记
录到数据库。
插入和删除笔记:为了学习如何添加一些笔记记录,先看看NoteActivity这个类。首
先,我们必须在onCreate函数里面为我们的Note类准备一个DAO对象。
// get the note DAO
DaoSession daoSession = ((App) getApplication()).getDaoSession();
noteDao = daoSession.getNoteDao();
当用户点击添加按钮的时候,addNote()函数就会被调用。我们在那儿创建一个新的
Note对象,然后把该对象传到DAOs的insert()方法里面去,从而使其插入数据库。
Note note = new Note(null, noteText, comment, new Date());
noteDao.insert(note);
Log.d("DaoExample", "Inserted new note, ID: " + note.getId());
注意:既然我们刚刚在实例化Note的时候,并没有把id传进构造方法。在这种情况下,数
据库决定note的id,DAO会在从插入操作返回前自动追加新的id。
删除一个note也是直接了当的,可以去看NoteClickListener的接口。
如果你能搞定上面这些,你页可以去探索一下其他的方法,比如loadAll()和
update()
构建配置数据库:你早已经见过了DAOs了,但是你如何初始化绿刀和底层的数据库呢
?通常你需要在Application类里面初始化DaoSession,这事干一次就够了。
DevOpenHelper helper = new DevOpenHelper(this, "notes-db");
Database db = helper.getWritableDb();
daoSession = new DaoMaster(db).newSession();
这个数据库的创建是借助了已经生成了的DaoMaster类提供的辅助类DevOpenHelper,
DevOpenHelper是DaoMaster中OpenHelper 的实现类,为你做了所有的数据库的构建
配置工作,因为有它,你就不必再去写“CREATE TABLE”这样的SQL语句了。
然后,activity和碎片就可以通过调用getDaoSession()来访问DAO实体,在插入和删
除note的时候就像上图显示的那样。
扩展和添加实体:为了扩展我们的note或者创建新的实体,你只需要简单地修改或创
建java类,然后以同样的方式注解就可以了。然后重新构建你的工程。
既然你对绿刀有了一个初步的印象了,那么现在去自己动手试一试吧。点击“文档”
去查看完整的API文档。
核心概念介绍
绿刀是Android开发中的对象关系映射工具,它为关系型数据库SQLite提供了一个对
象导向型的接口。像绿刀这样的ORM工具为你做了大量繁琐性的工作,并为你的数据
提供一个简单的接口。
为了在你的Android项目中使用绿刀,你需要添加绿刀的插件并添加绿刀的库:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
}
}
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao'
dependencies {
compile 'org.greenrobot:greendao:3.2.0'
}
核心类:一旦工程被创建,你就可以在你的安卓工程中使用绿刀。下面的几个核心类
是绿刀最重要的接口:
(1)DaoMaster:使用绿刀的入口点类。DaoMaster 持有一个SQLiteDatabase的数据
库对象,并且为指定的表管理DAO类(不是DAO对象)。它拥有创建或删除表的静态方
法。它的内部类OpenHelper 和DevOpenHelper 是SQLiteOpenHelper 的实现类,它们
可以在SQLite 数据库中创建表。
(2)DaoSession:为指定的表管理所有的DAO对象,你可以通过getter函数来获得。
DaoSession 也提供了一些常用的持久化技术,比如对实体的插入、加载、修改、刷
新和删除。最后,一个DaoSession的对象也可以追踪一个ID的范围,详情请见
session documentation.
(3)DAOs:数据访问对象为实体提供持久化和查询。对于每一个实体,绿刀都会生
成一个DAO。相比于DaoSession,它有更多的持久化函数,比如count啦,loadAll啦
,还有insertInTx。
(4)实体:可持久化的对象。通常情况下,实体是展示数据库单行数据的对象,使
用的是标准的Java属性,比如POJO或Bean文件。
核心的初始化:最后,下面的代码样例会展示初始化数据库和绿刀核心类的一些前置
步骤:
// do this once, for example in your Application class
helper = new DaoMaster.DevOpenHelper(
this, "notes-db", null);
db = helper.getWritableDatabase();
daoMaster = new DaoMaster(db);
daoSession = daoMaster.newSession();
// do this in your activities/fragments to get hold of a DAO
noteDao = daoSession.getNoteDao();
这个例子是假设了一个Note实体已存在。有DAO(noteDao对象)的存在,我们可以为这
个指定的实体进行持久化操作。