前言

我相信,在平时的开发过程中,大家一定会或多或少地接触到 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」模块

  1. 在 .src/main 目录下新建一个与 java 同层级的「java-gen」目录,用于存放由 greenDAO 生成的 Bean、DAO、DaoMaster、DaoSession 等类。 

  2. 配置 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 工程)

  1. 通过 File -> New -> New Module -> Java Library -> 填写相应的包名与类名 -> Finish.

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

compile 'de.greenrobot:greendao-generator:1.3.1'
  1. 编写 ExampleDaoGenerator 类,注意: 我们的 Java 工程只有一个类,它的内容决定了「GreenDao Generator」的输出,你可以在这个类中通过对象、关系等创建数据库结构,下面我将以注释的形式详细讲解代码内容。

public class ExampleDaoGenerator {public static void main(String[] args) throws Exception {// 正如你所见的,你创建了一个用于添加实体(Entity)的模式(Schema)对象。// 两个参数分别代表:数据库版本号与自动生成代码的包路径。Schema schema = new Schema(1, "me.itangqi.greendao");
//      当然,如果你愿意,你也可以分别指定生成的 Bean 与 DAO 类所在的目录,只要如下所示:
//      Schema schema = new Schema(1, "me.itangqi.bean");
//      schema.setDefaultJavaPackageDao("me.itangqi.dao");// 模式(Schema)同时也拥有两个默认的 flags,分别用来标示 entity 是否是 activie 以及是否使用 keep sections。// schema2.enableActiveEntitiesByDefault();// schema2.enableKeepSectionsByDefault();// 一旦你拥有了一个 Schema 对象后,你便可以使用它添加实体(Entities)了。addNote(schema);// 最后我们将使用 DAOGenerator 类的 generateAll() 方法自动生成代码,此处你需要根据自己的情况更改输出目录(既之前创建的 java-gen)。// 其实,输出目录的路径可以在 build.gradle 中设置,有兴趣的朋友可以自行搜索,这里就不再详解。new DaoGenerator().generateAll(schema, "/Users/tangqi/android-dev/AndroidStudioProjects/MyGreenDAO/app/src/main/java-gen");}/*** @param schema*/private static void addNote(Schema schema) {// 一个实体(类)就关联到数据库中的一张表,此处表名为「Note」(既类名)Entity note = schema.addEntity("Note");// 你也可以重新给表命名// note.setTableName("NODE");// greenDAO 会自动根据实体类的属性值来创建表字段,并赋予默认值// 接下来你便可以设置表中的字段:note.addIdProperty();note.addStringProperty("text").notNull();// 与在 Java 中使用驼峰命名法不同,默认数据库中的命名是使用大写和下划线来分割单词的。// For example, a property called “creationDate” will become a database column “CREATION_DATE”.note.addStringProperty("comment");note.addDateProperty("date");}
}

三. 生成 DAO 文件(数据库)

  • 执行 generator 工程,如一切正常,你将会在控制台看到如下日志,并且在主工程「java-gen」下会发现生成了DaoMaster、DaoSession、NoteDao、Note共4个类文件。 

如果在此处出错,你可以依据错误日志进行排查,主要看是否输出目录存在?其他配置是否正确?等

四. 在 ANDROID 工程中进行数据库操作

这里,我们只创建一个 NodeActivity 类,用于测试与讲解 greenDAO 的增、删、查功能。

  • activity_note.xml

<?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"><LinearLayoutandroid:id="@+id/linearLayout1"android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"><EditTextandroid: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><Buttonandroid:id="@+id/buttonAdd"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="onMyButtonClick"android:text="Add"></Button><Buttonandroid:id="@+id/buttonSearch"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="onMyButtonClick"android:text="Search"></Button></LinearLayout><ListViewandroid:id="@android:id/list"android:layout_width="fill_parent"android:layout_height="wrap_content"></ListView>
</LinearLayout>
  • NoteActivity.java

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";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_note);// 官方推荐将获取 DaoMaster 对象的方法放到 Application 层,这样将避免多次创建生成 Session 对象setupDatabase();// 获取 NoteDao 对象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,你可以得到一个便利的 SQLiteOpenHelper 对象。// 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。// 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db", null);db = helper.getWritableDatabase();// 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。daoMaster = new DaoMaster(db);daoSession = daoMaster.newSession();}private NoteDao getNoteDao() {return daoSession.getNoteDao();}/*** Button 点击的监听事件** @param view*/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());// 插入操作,简单到只要你创建一个 Java 对象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 query = getNoteDao().queryBuilder().where(NoteDao.Properties.Text.eq("Test1")).orderAsc(NoteDao.Properties.Date).build();//      查询结果以 List 返回
//      List notes = query.list();// 在 QueryBuilder 类中内置两个 Flag 用于方便输出执行的 SQL 语句与传递参数的值QueryBuilder.LOG_SQL = true;QueryBuilder.LOG_VALUES = true;}/*** ListView 的监听事件,用于删除一个 Item* @param l* @param v* @param position* @param id*/@Overrideprotected void onListItemClick(ListView l, View v, int position, long id) {// 删除操作,你可以通过「id」也可以一次性删除所有getNoteDao().deleteByKey(id);
//        getNoteDao().deleteAll();Log.d(TAG, "Deleted note, ID: " + id);cursor.requery();}
}

五. 运行结果

一切就绪,让我们看看效果吧!运行程序,分别执行添加按钮、删除(点击 List 的 Item)与查询按钮,可以在控制台得到如下日志:
  

最后

  • 本文的 Demo 下载链接:https://github.com/tangqi92/MyGreenDAO

  • 本教程旨在介绍 greenDAO 的基本用法与配置,更高级与详细的使用,请参见 官网

  • 如本文有任何错误与遗漏,欢迎指正。同时我期待与大家成为朋友,所以欢迎在社交网络上互粉!!!

References & More

http://greendao-orm.com/ https://github.com/greenrobot/greenDAOhttp://stackoverflow.com/questions/tagged/greendaohttps://groups.google.com/forum/#!forum/greendao

Android ORM 框架之 greenDAO 使用心得相关推荐

  1. Android ORM 框架:GreenDao 数据库升级

    本文作者:Speedy CSDN 专栏:blog.csdn.net/speedystone 掘金专栏:juejin.im/user/57e082- 前言 在 Android ORM 框架:GreenD ...

  2. androidentity什么用_Android ORM 框架:GreenDao 使用详解(进阶篇)

    前言 在 Android ORM 框架:GreenDao 使用详解(基础篇) 中,我们了解了 GreenDao 的基本使用,本文我们将深入讲解 GreenDao 的使用 . 一.复杂表结构 a, 使用 ...

  3. Android ORM框架GreenDao用法

    Android ORM框架GreenDao用法 0 简介 android 上的ORM框架主要有两个:ormlite 和 GreenDAO,本篇主要介绍GreenDao的用法,原因是GreenDAO的速 ...

  4. Android ORM框架 GreenDao 的使用详解

    一.前言 关于 Android 中常用的数据存储方式我们前面已经讲了 Sp 存储 和 文件存储,但是对于数据量比较大,并且结构复杂的数据我们想要存储只能通过数据库进行处理,Android 中提供了一个 ...

  5. Orm框架介绍和常见的Android Orm框架

    ORM(Object Relational Mapping)框架采用元数据来描述对象一关系映射细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中. 先介绍一下ORM的概念,以前也一直听说 ...

  6. 最受欢迎的5个Android ORM框架

    在开发Android应用时,保存数据有这么几个方式, 一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择). 对于第一种方式, ...

  7. android ORM框架的性能简单测试(androrm vs ormlite)

    2019独角兽企业重金招聘Python工程师标准>>> 前言 看了一下现在的android设备,性能都不差,就懒得直接用sqlite,直接上ORM框架把,上网搜了一圈,觉得andro ...

  8. android的orm框架有哪些,android orm 框架有哪些

    1.Afinal Afinal是一个android的ioc,orm框架,内置了四大模块功能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp.通过finalAc ...

  9. android ORM框架LitePal 封装SQLite

    LitePal的基本用法 虽说LitePal宣称是近乎零配置,但也只是"近乎"而已,它还是需要进行一些简单配置才可以使用的,那么我们第一步就先快速学习一下LitePal的配置方法. ...

最新文章

  1. 你的sql查询为什么这么慢?
  2. 20165328 预备作业3 Linux安装及命令
  3. asp.net中创建一个简单的自定义控件
  4. zcmu 4935(排序)
  5. 【线性代数本质】4:矩阵乘法本质
  6. es6 Class 的 name 属性
  7. 李群与李代数2:李代数求导和李群扰动模型
  8. Entity Framework Core DbContext内置方法
  9. iOS 视频播放器开发(一)
  10. 19 个接私活平台汇总,你有技术就有钱
  11. 核苷酸和氨基酸蛋白序列转换的工具
  12. layui表格换行,有固定列的情况
  13. 【APICloud系列|15】上架ios应用到苹果应用市场总结
  14. 使用DiskMan(DiskGen)恢复被删除的分区
  15. 国际黄金价格和美元指数之间是什么关系?
  16. QT5 ubuntu虚拟机下远程连接AGX或arm嵌入式开发板
  17. 顺势而生的聚合支付行业,未来的路该走向何方?
  18. SWT行 AWT/Swing也行系列 1 -实现半透明及不规则窗体
  19. 基于Ohta颜色空间的火焰分割
  20. Android网络图片加载框架的选择

热门文章

  1. 用final修饰的HashMap,到底可不可以修改??
  2. macOS 环境安装Flutter
  3. 8、mybatis之增删改查
  4. java快速排序泛型,如何进行对C# .NET通用泛型进行快速排序?
  5. 大地发生了变化写具体_小学语文三年级下册期末检测卷 (2)
  6. 百度视频携手神策数据,引领基于 AI 的短视频推荐技术新潮流
  7. 短融网杨夏耘:数据如何驱动金融科技业务升级?
  8. 从零开始玩转logback
  9. 如何将外部邮箱添加至Exchange邮件组中
  10. 解决MSSQL MMC企业管理器打开报错问题