最近在对开发项目的性能进行优化。由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁的读写、查询等操作。因此首先想到了对整个项目的数据库框架进行优化。
原先使用android本身内置的sqllite,也就是用的最基本的SQLiteOpenHelper方法,这种方法对自己来说比较方便易懂。但是在使用过程中感觉很繁琐,从建表到对表的增删改查等操作,如果表对象的属性很多,就需要使用大量的代码来执行建表、插入等。在代码执行中还需要对数据库和游标的进行及时关闭(开启使用,用完关闭),而且还需要部分sql语言,这在开发中产生bug进行调试时尤其不方便。
目前android经常用的orm框架主要有greenDAO、OrmLite、AndrORM。 综合了网上的各种评价,greenDAO的运行效率最高,内存消耗最少,性能最佳。因此决定采用greenDAO框架,对项目的orm框架进行改进。
     
greenDAO与ORMLite性能对比
经过两天的修改,终于将项目里的数据库相关的都优化完了。在这过程中,发现greenDAO的性能确实不错,而且使用相当方便,不再需要涉及到任何的sql语言,可以直接通过对象类进行建表、增删改查等,尤其是api接口又方便易懂。在摸索学习中发现国内相关学习资料实在实在是太少,遂决定在此记录下自己对使用这个orm框架的一些心得和方法总结。
一、greenDAO相关
1.greenDAO官网:http://greendao-orm.com/
2.项目下载地址:https://github.com/greenrobot/greenDAO(或者官网)
  greenDAO是一个可以帮助 Android 开发者快速将Java对象映射到SQLite数据库的表单中的ORM解决方案,通过使用一个简单的面向对象API,开发者可以对Java对象进行存储、更新、删除和查询。 
greenDAO的主要设计目标:
  *最大性能(最快的 Android ORM) 
*易于使用API
*高度优化
*最小内存消耗
二、使用步骤
官方Demo里共有六个工程目录,分别为:
(1).DaoCore:库目录,即jar文件greendao-1.3.0-beta-1.jar的代码;
(2).DaoExample:android范例工程;
(3).DaoExampleGenerator:DaoExample工程的DAO类构造器,java工程;
(4).DaoGenerator:DAO类构造器,java工程;
(5).DaoTest、PerformanceTestOrmLite:其他测试相关的工程。
(一)DAO类构造
首先需要新建一个java工程来生成DAO类文件,该工程需要导入greendao-generator.jar和freemarker.jar文件到项目中。

  1. package de.greenrobot.daogenerator.gentest;
  2. import de.greenrobot.daogenerator.DaoGenerator;
  3. import de.greenrobot.daogenerator.Entity;
  4. import de.greenrobot.daogenerator.Property;
  5. import de.greenrobot.daogenerator.Schema;
  6. import de.greenrobot.daogenerator.ToMany;
  7. /** * Generates entities and DAOs for the example project DaoExample. * * Run it as a Java application (not Android). * * @author Markus */
  8. public class ExampleDaoGenerator
  9. {        public static void main(String[] args) throws Exception        {        Schema schema = new Schema(3, "de.greenrobot.daoexample");        addNote(schema);        addCustomerOrder(schema);        new DaoGenerator().generateAll(schema, "../DaoExample/src-gen");        }        private static void addNote(Schema schema)        {        Entity note = schema.addEntity("Note");        note.addIdProperty();        note.addStringProperty("text").notNull();        note.addStringProperty("comment");        note.addDateProperty("date");        }        private static void addCustomerOrder(Schema schema)        {        Entity customer = schema.addEntity("Customer");        customer.addIdProperty();        customer.addStringProperty("name").notNull();        Entity order = schema.addEntity("Order");        order.setTableName("ORDERS"); // "ORDER" is a reserved keyword        order.addIdProperty();        Property orderDate = order.addDateProperty("date").getProperty();        Property customerId = order.addLongProperty("customerId").notNull().getProperty();        order.addToOne(customer, customerId);        ToMany customerToOrders = customer.addToMany(order, customerId);        customerToOrders.setName("orders");        customerToOrders.orderAsc(orderDate);        }
  10. }

复制代码

在main方法中,

  1. Schema schema = new Schema(3, "de.greenrobot.daoexample");

复制代码

该方法第一个参数用来更新数据库版本号,第二个参数为要生成的DAO类所在包路径。
然后进行建表和设置要生成DAO文件的目标工程的项目路径。

  1. addNote(schema);
  2. addCustomerOrder(schema);
  3. new DaoGenerator().generateAll(schema, "../DaoExample/src-gen");

复制代码

其中src-gen这个目录名需要在运行前手动创建,否则会报错。
如果运行后出现以下错误,则导入DaoGenerator项目的dao.ftl文件即可(或者直接使用DaoGenerator来生成DAO文件)。

  1. Exception in thread "main" java.io.FileNotFoundException: Template "dao.ftl" not found. at freemarker.template.Configuration.getTemplate(Configuration.java:742) at freemarker.template.Configuration.getTemplate(Configuration.java:665) at de.greenrobot.daogenerator.DaoGenerator.(DaoGenerator.java:68) at de.greenrobot.daogenerator.gentest.ExampleDaoGenerator.main(ExampleDaoGenerator.java:41)

复制代码

运行后出现以下的提示说明DAO文件自动生成成功了,刷新一下DaoExample项目即可看到。

  1. greenDAO Generator
  2. Copyright 2011-2013 Markus Junginger, greenrobot.de. Licensed under GPL V3.
  3. This program comes with ABSOLUTELY NO WARRANTY
  4. Processing schema version 3...
  5. Written F:Android_Exwork_10DaoExamplesrc-gendegreenrobotdaoexampleNoteDao.java
  6. Written F:Android_Exwork_10DaoExamplesrc-gendegreenrobotdaoexampleNote.java
  7. Written F:Android_Exwork_10DaoExamplesrc-gendegreenrobotdaoexampleCustomerDao.java
  8. Written F:Android_Exwork_10DaoExamplesrc-gendegreenrobotdaoexampleCustomer.java
  9. Written F:Android_Exwork_10DaoExamplesrc-gendegreenrobotdaoexampleOrderDao.java
  10. Written F:Android_Exwork_10DaoExamplesrc-gendegreenrobotdaoexampleOrder.java
  11. Written F:Android_Exwork_10DaoExamplesrc-gendegreenrobotdaoexampleDaoMaster.java
  12. Written F:Android_Exwork_10DaoExamplesrc-gendegreenrobotdaoexampleDaoSession.java
  13. Processed 3 entities in 204ms

复制代码

运行后可以看到,DaoExample项目src-gen下面自动生成了8个文件,3个实体对象,3个dao,1个DaoMaster,1个DaoSession.
(二)创建表
1.创建一个实体类

  1. Entity note = schema.addEntity("Note");

复制代码

默认表名就是类名,也可以自定义表名

  1. dao.setTableName("NoteList");

复制代码

greenDAO会自动根据实体类属性创建表字段,并赋予默认值。例如在数据库方面的表名和列名都来源于实体类名和属性名。默认的数据库名称是大写使用下划线分隔单词,而不是在Java中使用的驼峰式大小写风格。例如,一个名为“CREATIONDATE”属性将成为一个数据库列“CREATION_DATE”。
设置一个自增长ID列为主键:

  1. dao.addIdProperty().primaryKey().autoincrement();

复制代码

设置其他各种类型的属性:

  1. dao.addIntProperty("cityId");
  2. dao.addStringProperty("infoType").notNull();//非null字段
  3. dao.addDoubleProperty("Id");

复制代码

在生成的实体类中,int类型为自动转为long类型。
如果在编译过程中出现以下错误,那么有可能是主键的类型错误所致:

  1. java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

复制代码

在使用greenDAO时,一个实体类只能对应一个表,目前没法做到一个表对应多个实体类,或者多个表共用一种对象类型。后续的升级也不会针对这一点进行扩展。
(二)表的增删改查
增删改查相当方便,完全的面向对象,不需要涉及到任何的sql语言。
1.查询
范例1:查询某个表是否包含某个id:

  1. Schema schema = new Schema(3, "de.greenrobot.daoexample");0

复制代码

范例2:获取整个表的数据集合,一句代码就搞定!

  1. Schema schema = new Schema(3, "de.greenrobot.daoexample");1

复制代码

范例3:通过一个字段值查找对应的另一个字段值(为简便直接使用下面方法,也许有更简单的方法,尚未尝试)

  1. Schema schema = new Schema(3, "de.greenrobot.daoexample");2

复制代码

范例4:查找所有第一姓名是“Joe”并且以lastname排序。

  1. Schema schema = new Schema(3, "de.greenrobot.daoexample");3

复制代码

范例5:多重条件查询
(1)获取id为cityId并且infotype为HBContant.CITYINFO_SL的数据集合:

  1. Schema schema = new Schema(3, "de.greenrobot.daoexample");4

复制代码

(2)获取firstname为“Joe”并且出生于1970年10月以后的所有user集合:

  1. Schema schema = new Schema(3, "de.greenrobot.daoexample");5

复制代码

范例6:获取某列对象

  1. Schema schema = new Schema(3, "de.greenrobot.daoexample");6

复制代码

2.增添/插入、修改
插入数据更加简单,也是只要一句代码便能搞定!

  1. Schema schema = new Schema(3, "de.greenrobot.daoexample");7

复制代码

插入时需要new一个新的对象,范例如下:

  1. Schema schema = new Schema(3, "de.greenrobot.daoexample");8

复制代码

修改更新:

  1. Schema schema = new Schema(3, "de.greenrobot.daoexample");9

复制代码

3.删除:
(1)清空表格数据

  1. addNote(schema);
  2. addCustomerOrder(schema);
  3. new DaoGenerator().generateAll(schema, "../DaoExample/src-gen");0

复制代码

(2)删除某个对象

  1. addNote(schema);
  2. addCustomerOrder(schema);
  3. new DaoGenerator().generateAll(schema, "../DaoExample/src-gen");1

复制代码

参考:https://github.com/greenrobot/greenDAO/issues/34
由上可见,使用greenDAO进行数据库的增删改查时及其方便,而且性能极佳。
(三)常用方法笔记
1.在Application实现得到DaoMaster和DaoSession的方法:

  1. addNote(schema);
  2. addCustomerOrder(schema);
  3. new DaoGenerator().generateAll(schema, "../DaoExample/src-gen");2

复制代码

2.增删改查工具类:

  1. addNote(schema);
  2. addCustomerOrder(schema);
  3. new DaoGenerator().generateAll(schema, "../DaoExample/src-gen");3

复制代码

另外,还有多表关联、惰性加载等功能,待后续研究。
参考资料:
1.https://github.com/greenrobot/greenDAO
2.http://greendao-orm.com/documentation/how-to-get-started/
3.http://blog.csdn.net/krislight/article/details/9391455

greenDAO简单使用经验相关推荐

  1. Android GreenDao简单使用

    现在市面上主流的框架有 OrmLite.SugarORM.Active Android.Realm 与 GreenDAO. 官网上的介绍,greenDAO 是一个将对象映射到 SQLite 数据库中的 ...

  2. GreenDao简单使用

    简介 greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案. GreenDao特点: 性能最大化,可能是Android平台上最快的ORM框架 易于使用的API ...

  3. 对Linux网络配置管理的简单使用经验

    安装Linux操作系统的服务器,一般都将做为应用服务器.对于服务器来讲,最重要的是网络安全的问题,现就对Linux的网络访问配置使用分别以配置和管理两部进行回顾总结. 网络访问配置管理 希望保证Lin ...

  4. Android ORM 框架之 greenDAO 使用心得

    前言 我相信,在平时的开发过程中,大家一定会或多或少地接触到 SQLite.然而在使用它时,我们往往需要做许多额外的工作,像编写 SQL 语句与解析查询结果等.所以,适用于 Android 的ORM  ...

  5. Android之greenDao(初识greenDao)

    文章目录 greenDao概述 greenDao配置(Android Studio) greenDao简单使用 greenDao实体类创建 greenDao增 greenDao删 greenDao改 ...

  6. Kubernetes 入门必备云原生发展简史

    作者|张磊 阿里云容器平台高级技术专家,CNCF 官方大使 "未来的软件一定是生长于云上的"这是云原生理念的最核心假设.而所谓"云原生",实际上就是在定义一条能 ...

  7. 云原生的本质_CloudNative

    [TOC] 阿里云原生技术公开课 第1章:云原生课 本节课程要点 云原生技术发展历程(为什么要学习这门课) 课程简介与预备知识(这门课到底教什么) 云原生的定义与技术要点(本节正式内容) 一.为什么要 ...

  8. Jenkins pipeline job 根据参数动态获取触发事件的分支

    此文需要有Jenkins pipeline job 的简单使用经验 场景 我们日常的测试函数, 一般是不能仅仅在本地跑的,还需要一个公共的跑测试的环境,作为合并新的PR的依据. 如果用Jenkins ...

  9. devexpress html编辑器,图解DevExpress RichEditControl富文本的使用,附源码及官方API

    9点半了,刚写到1.2.   该回家了,明天继续写完. 大家还需要什么操作,留言说一下,没有的我明天继续加. 好久没有玩DevExpress了,今天下载了一个玩玩,发现竟然更新到14.2.5了..我去 ...

  10. 【云服务架构】什么是云原生应用?有哪些特点?来看看阿里云大学公开课给你答案

    云原生技术发展简史 首先从第一个问题进行分享,那就是"为什么要开设云原生技术公开课?"云原生.CNCF 都是目前非常热门的关键词,但是这些技术并不是非常新鲜的内容. 2004 年- ...

最新文章

  1. HiveSQL窗口函数
  2. Dubbo监控中心配置
  3. Cocos Creator导出场景和预制的问题
  4. ckedit 3.0 配置(一)
  5. linux那些事之zero page
  6. java 蓝桥杯算法训练 水仙花(题解)
  7. matplotlib之scatter散点、bar直方图(笔记四)
  8. JAVA处理模型的步骤,java-处理模型中条件字段的最佳方法
  9. HTML注册页面代码实现(案例)
  10. VLAN间路由的配置(一)普通VLAN间路由的配置
  11. 自动驾驶常用传感器介绍
  12. 出现找不到sct文件解决方法:.\Objects\MyFirstExample.axf: error: L6031U: Could not open scatter descript
  13. VS2019配置WinRT
  14. 《大话物联网(第2版)》赠书活动名单公告
  15. Word处理控件Aspose.Words功能演示:使用 Java 将 Word 文档转换为 Markdown
  16. 网络带宽和下载速度的换算
  17. Stacked Attention Networks for Image Question Answering(用于图像问答的堆叠注意力网络)
  18. Django计算机毕业设计办公用品管理系统(程序+LW)Python
  19. 安卓语音识别(RecognizerIntent)
  20. 自己定义控件事实上非常easy1/6

热门文章

  1. compute和compute by
  2. QT入门学习(一):什么是QT
  3. win10计算机管理删除卷,win10系统删除卷或驱动器分区的方法
  4. Mysql 索引失效场景
  5. 原来华为手机音量键这么厉害!除了调声音,还有5个隐藏功能
  6. Python技巧:双击python文件打开.py(博主自测完整版)
  7. Telos 首份年报(中译版-下)
  8. 鸿蒙大陆9.1正式版礼包,鸿蒙大陆2.0正式版
  9. 思维导图怎么做计划的简单高效绘制方法
  10. excel 科学计数法导入数据库