Android GreenDao介绍和Generator生成表对象代码

转载请注明: 
http://blog.csdn.net/sinat_30276961/article/details/50052109

最近无意中发现了GreenDao,然后查看了一些资料后,发现这个数据库框架很适合用,于是乎,查看了官网的api,并自己写了一个小应用总结一下它的使用方法。

介绍

按照国际惯例,在开篇,总要先介绍一下什么是GreenDao吧。

首先需要说明的是GreenDao是基于ORM的Android端数据库框架。那么什么是ORM呢? 
ORM全称叫做对象关系映射(Object Relation Mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。 
面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的. 两者之间是不匹配的.而ORM作为项目中间件形式实现数据在不同场景下数据关系映射. 对象关系映射是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.ORM就是这样而来的。

大致就是这样,不懂也没事,看个例子就清楚了。

基于ORM的数据库框架现在其实已经有很多了,比方说OrmLite,它是基于注解和反射的的方式,所以性能差点,不过使用很方便。ps : 我还没用过。

But!我还是选择GreenDao,是因为:

Maximum performance (probably the fastest ORM for Android):系能最大化 
Easy to use APIs:便于使用 
Highly optimized for Android:对于Android高度优化 
Minimal memory consumption:最小化内存开销 
Small library size, focus on the essentials:较小的文件体积,只集中在必要的部分上。

And! 
效率很高,插入和更新的速度是sqlite的2倍,加载实体的速度是ormlite的4.5倍。官网测试结果:http://greendao-orm.com/features/ 
文件较小(<100K),占用更少的内存 ,但是需要create Dao, 
操作实体灵活:支持get,update,delete等操作。

缺点: 
学习成本较高。其中使用了一个java工程根据一些属性和规则去generate一些基础代码,类似于javaBean但会有一些规则,另外还有QueryBuilder、Dao等API,所以首先要明白整个过程,才能方便使用。没有ORMLite那样封装的完整,不过greenDao的官网上也提到了这一点,正是基于generator而不是反射,才使得其效率高的多。

关于这些缺点,其实本人感受不深,如果是简单应用,查看个api,代码测试一下,一两天就能上手。

ok,关于GreenDao的基本介绍就介绍到这。

接下去,我们就直接讲下它的工程创建和它的核心api。

创建工程

前面有提到,它的代码构建方式是通过java工程去generate一些基础代码的。那么,我们就来generate一下。ps : 这些基础代码到时候需要在Android工程里使用的。

首先,你得创建一个java工程。 
如果你是在Android Studio,那么你直接创建一个Android工程,然后module一个java lib工程,取名叫”dao”好了。 
然后,class名称取个”MyDaoGenerator”。

完毕之后,就如下图所示: 
这里写图片描述

然后java工程需要用到一个库greendao-generator,把它导入一下:

dependencies {
    compile 'de.greenrobot:greendao-generator:2.0.0'
}
   
   
  • 1
  • 2
  • 3

这些都ok之后,就可以写代码了:

    public static void main(String[] args) throws Exception {
        // 这里控制版本号和生成orm java文件的包
        Schema schema = new Schema(1, "com.office.steven.dao");
        addNews(schema);
        // 这里指定产生orm java文件所在路径
        new DaoGenerator().generateAll(schema, "D:\\stevenOffice\\TempProject\\GreenDaoTest\\app\\src\\main\\java");
    }
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

首先,执行入口main。然后创建一个Schema,Schema可以认为是用来产生数据表对象的模式类。 
new Schema(1, "com.office.steven.dao") 
1代码版本号,如果你新增了一些数据表对象,那么版本号要增加一下,然后数据库就会更新。第二个参数代表你生成的代码所在的包。

然后看下addNews(),这部分其实就是我写的一个小应用。

    private static void addNews(Schema schema) {
        Entity news = schema.addEntity("News");
        news.addIdProperty();
        news.addStringProperty("title").notNull();
        news.addStringProperty("time").notNull();

        // 一对一关系
        Entity detail = schema.addEntity("Detail");
        detail.addIdProperty();
        detail.addStringProperty("content").notNull();
        detail.addStringProperty("summary");

        Property detailId = news.addLongProperty("detailId").notNull().getProperty();
        news.addToOne(detail, detailId);

        // 一对多关系
        Entity opinion = schema.addEntity("Opinion");
        opinion.addIdProperty();
        opinion.addStringProperty("content").notNull();
        Property opinionTime = opinion.addStringProperty("time").notNull().getProperty();
        Property newsId = opinion.addLongProperty("newsId").notNull().getProperty();
        ToMany newsToOpinions = news.addToMany(opinion, newsId);
        newsToOpinions.setName("opinions");
        newsToOpinions.orderAsc(opinionTime);
    }
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

上面代码不多,也很清晰,写过数据库的朋友一般都能看懂。 
“Entity”这个代表一个数据表,用来生成数据表对应的对象。 
比方说第一个:

        Entity news = schema.addEntity("News");
        news.addIdProperty();
        news.addStringProperty("title").notNull();
        news.addStringProperty("time").notNull();
   
   
  • 1
  • 2
  • 3
  • 4

代表创建了一个”NEWS”数据表对应的对象”News”。当然此时,数据表还没产生。。 
然后设置它的三个字段:_id, TITLE, TIME。 
注意,这里默认都是大写的,当然如果你有强迫症喜欢小写,可以自己设置,详细查api~~我忘了。

然后,来看看“一对一”和“一对多”,至于“多对多”,暂时没时间去总结。 
“一对一”在这里也是很清晰的。 
我创建了一个News-新闻,然后每个新闻都有标题和时间。当然新闻还有摘要和内容。按道理,摘要和内容应该也放到”News”里,不过为了简单的展示下“一对一”,我就把它们取出来,放到”Detail”里了。

        Entity detail = schema.addEntity("Detail");
        detail.addIdProperty();
        detail.addStringProperty("content").notNull();
        detail.addStringProperty("summary");

        Property detailId = news.addLongProperty("detailId").notNull().getProperty();
        news.addToOne(detail, detailId);
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

创建完detail三个字段后,接着就是需要在”News”里新建一个字段detailId,用于关联detail(addToOne)。 
这里,是news去关联detail,当然你也可以detail关联news,都可以,只要插入数据和读取数据时调整一下就行。关于这部分,后面会讲到。

“一对多”和上面差不多。

        // 一对多关系
        Entity opinion = schema.addEntity("Opinion");
        opinion.addIdProperty();
        opinion.addStringProperty("content").notNull();
        Property opinionTime = opinion.addStringProperty("time").notNull().getProperty();
        Property newsId = opinion.addLongProperty("newsId").notNull().getProperty();
        ToMany newsToOpinions = news.addToMany(opinion, newsId);
        newsToOpinions.setName("opinions");
        newsToOpinions.orderAsc(opinionTime);
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

这里,我用新闻的评价来展示“一对多”。一个新闻肯定包含多个评价,是吧。 
“一对多”要在“多”的那个里建立一个关联id。所以,这里创建了一个“newsId”。然后News去addToMany。这个返回对象可以进一步做处理,比方说设置“一对多”的名称和获取到的数据排序方式。

“多对多”的话,要创建一个中间表,包含两个字段,一个是左边的,一个是右边的。这里就不展开讲了。

至此,创建的表和字段结束。接着就是生成代码:

new DaoGenerator().generateAll(schema, "D:\\stevenOffice\\TempProject\\GreenDaoTest\\app\\src\\main\\java");
   
   
  • 1

第二个参数是生成的代码的路径。

然后就是”make”一下,一切顺利,就会在Android工程生成那部分代码。 
这里写图片描述

可以看到,有”DaoMaster”、”DaoSession”、”News”、”NewsDao”等。

DaoMaster:可以认为是Dao中的执行官。它保存了sqlitedatebase对象以及操作DAO classes(注意:不是对象)。其提供了一些创建和删除table的静态方法,其内部类OpenHelper和DevOpenHelper实现了SQLiteOpenHelper并创建数据库的框架。

DaoSession:会话层。操作具体的DAO对象(注意:是对象),比如各种getter方法。

XXXDao:生成的某某Dao类,通常对应具体的java类,比如NewsDao等。其有更多的权限和方法来操作数据库元素(比方说插入、更新、删除、查询等等)。

XXX:持久的实体对象。通常代表了一个数据表的标准java properties。

这就是ORM的精髓所在。

至此,关于GreenDao的介绍和生成业务代码这部分的介绍就到这里。下一篇会针对实例讲解GreenDao的核心api。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值