前言
我相信,在平时的开发过程中,大家一定会或多或少地接触到 SQLite。然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等。所以,适用于 Android 的ORM 框架也就孕育而生了,现在市面上主流的框架有 OrmLite、SugarORM、Active Android、Realm 与 GreenDAO。而今天的主角便是 greenDAO,下面,我将详解地介绍如何在 Android Studio 上使用 greenDAO,并结合代码总结一些使用过程中的心得。
关于 greenDAO

简单的讲,greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。(greenDAO is a light & fast ORM solution that maps objects to SQLite databases.)
而关于 ORM (Object Relation Mapping - 对象关系映射)的概念,可参见 Wikipedia。
GREENDAO 设计的主要目标
-
一个精简的库
-
性能最大化
-
内存开销最小化
-
易于使用的 APIs
-
对 Android 进行高度优化
GREENDAO 设计的主要特点
-
greenDAO 性能远远高于同类的 ORMLite,具体测试结果可见官网
-
greenDAO 支持 protocol buffer(protobuf) 协议数据的直接存储,如果你通过 protobuf 协议与服务器交互,将不需要任何的映射。
-
与 ORMLite 等使用注解方式的 ORM 框架不同,greenDAO 使用「Code generation」的方式,这也是其性能能大幅提升的原因。
DAO CODE GENERATION PROJECT

这是其核心概念:为了在我们的 Android 工程中使用 greenDAO ,我们需要另建一个纯 Java Project,用于自动生成后继 Android 工程中需要使用到的 Bean、DAO、DaoMaster、DaoSession 等类。
CORE CLASSES & MODELLING ENTITIES
关于以上几个类的相关概念与作用,我将在下面的代码(注释)中详细讲解。
当然,你也可以在 官网 中找到相关介绍。
让我们开始吧
一. 在 ANDROID 工程中配置「GREENDAO GENERATOR」模块
-
在 .src/main 目录下新建一个与 Java 同层级的「java-gen」目录,用于存放由 greenDAO 生成的 Bean、DAO、DaoMaster、DaoSession 等类。


-
配置 Android 工程(app)的 build.gradle,如图分别添加 sourceSets 与dependencies。 
- sourceSets {
- main {
- java.srcDirs = ['src/main/java', 'src/main/java-gen']
- }
- }
- compile 'de.greenrobot:greendao:1.3.7'
二. 新建「GREENDAO GENERATOR」模块 (纯 JAVA 工程)
-
通过 File -> New -> New Module -> Java Library -> 填写相应的包名与类名 -> Finish.



-
配置 daoexamplegenerator 工程的 build.gradle,添加 dependencies.
-

- compile 'de.greenrobot:greendao-generator:1.3.1'
-
编写 ExampleDaoGenerator 类,注意: 我们的 Java 工程只有一个类,它的内容决定了「GreenDao Generator」的输出,你可以在这个类中通过对象、关系等创建数据库结构,下面我将以注释的形式详细讲解代码内容。
- public class ExampleDaoGenerator {
- public static void main(String[] args) throws Exception {
-
-
- Schema schema = new Schema(1, "me.itangqi.greendao");
-
-
-
-
-
-
-
-
-
- addNote(schema);
-
-
-
- new DaoGenerator().generateAll(schema, "/Users/tangqi/android-dev/AndroidStudioProjects/MyGreenDAO/app/src/main/java-gen");
- }
-
-
-
-
- private static void addNote(Schema schema) {
-
- Entity note = schema.addEntity("Note");
-
-
-
-
-
- note.addIdProperty();
- note.addStringProperty("text").notNull();
-
-
- note.addStringProperty("comment");
- note.addDateProperty("date");
- }
- }
三. 生成 DAO 文件(数据库)
如果在此处出错,你可以依据错误日志进行排查,主要看是否输出目录存在?其他配置是否正确?等
四. 在 ANDROID 工程中进行数据库操作
这里,我们只创建一个 NodeActivity 类,用于测试与讲解 greenDAO 的增、删、查功能。
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical">
-
- <LinearLayout
- android:id="@+id/linearLayout1"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal">
-
- <EditText
- android:id="@+id/editTextNote"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_weight="1"
- android:hint="Enter new note"
- android:inputType="text"></EditText>
-
- <Button
- android:id="@+id/buttonAdd"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:onClick="onMyButtonClick"
- android:text="Add"></Button>
-
- <Button
- android:id="@+id/buttonSearch"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:onClick="onMyButtonClick"
- android:text="Search"></Button>
- </LinearLayout>
-
- <ListView
- android:id="@android:id/list"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"></ListView>
- </LinearLayout>
- public class NoteActivity extends ListActivity {
- private SQLiteDatabase db;
- private EditText editText;
- private DaoMaster daoMaster;
- private DaoSession daoSession;
- private Cursor cursor;
- public static final String TAG = "DaoExample";
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_note);
-
- setupDatabase();
-
- getNoteDao();
-
- String textColumn = NoteDao.Properties.Text.columnName;
- String orderBy = textColumn + " COLLATE LOCALIZED ASC";
- cursor = db.query(getNoteDao().getTablename(), getNoteDao().getAllColumns(), null, null, null, null, orderBy);
- String[] from = {textColumn, NoteDao.Properties.Comment.columnName};
- int[] to = {android.R.id.text1, android.R.id.text2};
-
- SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cursor, from,
- to);
- setListAdapter(adapter);
-
- editText = (EditText) findViewById(R.id.editTextNote);
- }
-
- private void setupDatabase() {
-
-
-
-
- DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
- db = helper.getWritableDatabase();
-
- daoMaster = new DaoMaster(db);
- daoSession = daoMaster.newSession();
- }
-
- private NoteDao getNoteDao() {
- return daoSession.getNoteDao();
- }
-
-
-
-
-
-
- public void onMyButtonClick(View view) {
- switch (view.getId()) {
- case R.id.buttonAdd:
- addNote();
- break;
- case R.id.buttonSearch:
- search();
- break;
- default:
- Log.d(TAG, "what has gone wrong ?");
- break;
- }
- }
-
- private void addNote() {
- String noteText = editText.getText().toString();
- editText.setText("");
-
- final DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM);
- String comment = "Added on " + df.format(new Date());
-
-
- Note note = new Note(null, noteText, comment, new Date());
- getNoteDao().insert(note);
- Log.d(TAG, "Inserted new note, ID: " + note.getId());
- cursor.requery();
- }
-
- private void search() {
-
- Query query = getNoteDao().queryBuilder()
- .where(NoteDao.Properties.Text.eq("Test1"))
- .orderAsc(NoteDao.Properties.Date)
- .build();
-
-
-
-
- QueryBuilder.LOG_SQL = true;
- QueryBuilder.LOG_VALUES = true;
- }
-
-
-
-
-
-
-
-
- @Override
- protected void onListItemClick(ListView l, View v, int position, long id) {
-
- getNoteDao().deleteByKey(id);
-
- Log.d(TAG, "Deleted note, ID: " + id);
- cursor.requery();
- }
- }
五. 运行结果
一切就绪,让我们看看效果吧!运行程序,分别执行添加按钮、删除(点击 List 的 Item)与查询按钮,可以在控制台得到如下日志:

最后
References & More
http://greendao-orm.com/ https://github.com/greenrobot/greenDAOhttp://stackoverflow.com/questions/tagged/greendaohttps://groups.google.com/forum/#!f