ORM 框架之greenDAO

我相信,大家在开发Android的过程中或多或少都会接触到SQLite,然而我们再使用的时候需要做很多额外工作,编写SQL语句,查询结果更新等等。这事适用于Android的ORM框架就孕育而生了,现在主流的框架有 OrmLite、SugarORM、Active Android、Realm 与 GreenDAO。我们今天就给大家介绍一下GreenDAO!

关于 greenDAO

Paste_Image.png

greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。
关于greenDAO的概念可以看官网 greenDAO

greenDAO 设计的主要目标

一个精简的库
性能最大化
内存开销最小化
易于使用的 APIs
对 Android 进行高度优化

greenDAO 的主要优势

性能上优于同类的orm,这个官网有性能的比较 有兴趣的可以去官网看一下 我就不贴图了
greenDAO 支持protocol buffer(protobuf)协议数据的直接存储,如果你通过 protobuf 协议与服务器交互,将不需要任何的映射。
与 ORMLite 等使用注解方式的 ORM 框架不同,greenDAO 使用「Code generation」的方式,这也是其性能能大幅提升的原因。

让我们开始吧

一. 在 Android 工程中配置「greenDao Generator」模块

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

Paste_Image.png
Paste_Image.png

2.配置 Android 工程(app)的 build.gradle,如图分别添加sourceSetsdependencies

Paste_Image.png

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.

Paste_Image.png

2.配置 新建的工程的中build.gradle,添加 dependencies.

Paste_Image.png

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

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

public class DaoExampleGenerator {    
public static void main(String[] args) throws Exception {       
 // 正如你所见的,你创建了一个用于添加实体(Entity)的模式(Schema)对象。     
  // 两个参数分别代表:数据库版本号与自动生成代码的包路径。        
Schema schema = new Schema(1, "com.example.junweiup.greendaodem");
//      当然,如果你愿意,你也可以分别指定生成的 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, "../GreenDAodemo/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个类文件。


Paste_Image.png

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

Paste_Image.png

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

我们要在Application中初始化

Paste_Image.png

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

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());    
if (noteText == null || noteText.equals("")) {     
   ToastUtils.show(getApplicationContext(), "Please enter a note to add");   
 } else {   
     // 插入操作,简单到只要你创建一个 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() {  
  String noteText = editText.getText().toString();   
 editText.setText("");    if (noteText == null || noteText.equals("")) {     
   ToastUtils.show(getApplicationContext(), "Please enter a note to query");   
 } else {       
 // Query 类代表了一个可以被重复执行的查询        
Query query = getNoteDao().queryBuilder()                
.where(NoteDao.Properties.Text.eq(noteText))               
 .orderAsc(NoteDao.Properties.Date)              
  .build();        
// 查询结果以 List 返回        
List notes = query.list();       
 ToastUtils.show(getApplicationContext(), "There have " + notes.size() + " records");    }   
 // 在 QueryBuilder 类中内置两个 Flag 用于方便输出执行的 SQL 语句与传递参数的值    QueryBuilder.LOG_SQL = true;  
  QueryBuilder.LOG_VALUES = true;  
  Query<Note> query = getNoteDao().queryBuilder()            .where(NoteDao.Properties.Text.eq(noteText))           
 .build();   
 List<Note> list = query.list();    
Toast.makeText(NoteActivity.this, "text"+list.size(), Toast.LENGTH_SHORT).show();
}

最后

本文 Demo 下载链接:https://github.com/JunWeiUp/GreenDao/,,如果喜欢的话可以star一下。╭(╯ε╰)╮
本教程旨在介绍 greenDAO 的基本用法与配置,更高级与详细的使用,请参见官网
如本文有任何问题欢迎指正。

参考自

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容