移动APP追求追求功能实现的同一时候,用户体验很重要。開始APP的同一时候。要时刻的切换开发人员的角色,如你开发的时候。是

站在APP的开发角色,处于生产者的位置;当你測试的时候。你应该把自己放在用户的角色上去考虑所做的APP了。举一个非常easy的

样例,就像我们天天使用手机上的新闻、好友动态等,当你没有网络的时候,也还有数据的存在提供用户浏览,而不是一篇”白

色“的。如同电脑死机一般。这就是移动APP在开发的时候,提供了最后一次网络状态下的数据缓存,提到数据缓存,可想而知有内

存缓存、硬件缓存之分。在这我主要讲述的是一个硬件缓存-----Android开发数据库之第三方ORM框架(GreenDao)。

开发了那么久的移动APP。近期工作量比較小,闲着没事在对开发项目的性能进行优化。因为项目里涉及了大量的缓存处理和数

据库运用,须要对数据库进行频繁的读写、查询等操作。因此首先想到了对整个项目的数据库框架进行优化。

原先使用android本身

内置的sqllite,也就是用的最主要的SQLiteOpenHelper方法,这样的方法对自己来说比較方便易懂。

可是在使用过程中感觉非常繁琐,

从建表到对表的增删改查等操作,假设表对象的属性非常多,就须要使用大量的代码来运行建表、插入等。在代码运行中还须要对数

据库和游标的进行及时关闭(开启使用,用完关闭),并且还须要部分sql语言。这在开发中产生bug进行调试时尤其不方便。眼下

android经经常使用的orm框架主要有greenDAO、OrmLite、AndrORM。 综合了网上的各种评价,greenDAO的执行效率最高。内存消耗最

少,性能最佳。

因此决定採用greenDAO框架。对项目的orm框架进行改进。

何以体现greenDAO的优势呢?以下 greenDAO与ORMLite性能对照:

经过几天的改动,最终将项目里的数据库相关的都优化完了。

在这过程中,发现greenDAO的性能确实不错,并且使用相当方便。不再须要涉及到不论什么的sql语言。能够直接通过对象类进行建表、增删改查等。尤其是api接口又方便易懂。在摸索学习中发现国内相关学习资料实在实在是太少,遂决定在此记录下自己对使用这个orm框架的一些心得和方法总结。

一、greenDAO框架相关资源

首先greenDAO作为第三方的数据库ORM框架。那必然有它的相关站点等资源。

1、greenDAO官网:http://greendao-orm.com/
   

       2、项目下载地址:https://github.com/greenrobot/greenDAO(或者官网)

greenDAO是一个能够帮助Android开发人员高速将Java对象映射到SQLite数据库的表单中的ORM解决方式,通过使用一个简单的面向对象API,开发人员能够对Java对象进行存储、更新、删除和查询。

greenDAO的主要设计目标:

*最大性能(最快的Android ORM)

*易于使用API

*高度优化

*最小内存消耗

二、开发使用步骤(重点)

1、下载greenDAO框架资源后,解压分析官方Demo里共同拥有六个project文件夹,分别为:

(1).DaoCore:库文件夹,即jar文件greendao-1.3.0-beta-1.jar的代码。

(2).DaoExample:android范例project。

(3).DaoExampleGenerator:DaoExampleproject的DAO类构造器。javaproject;

(4).DaoGenerator:DAO类构造器。javaproject;

(5).DaoTest、PerformanceTestOrmLite:其它測试相关的project。

2、DAO类构造

首先须要新建一个javaproject来生成DAO类文件。该project须要导入greendao-generator.jar和freemarker.jar文件到项目中。

public class ExampleDaoGenerator

{

 

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 key<a href="http://www.it165.net/edu/ebg/" target="_blank" class="keylink">word</a>

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);

}

}

在main方法中。分析例如以下:

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

该方法第一个參数用来更新数据库版本,第二个參数为要生成的DAO类所在包路径。

            然后进行建表和设置要生成DAO文件的目标project的项目路径。

addNote(schema);

            addCustomerOrder(schema);

            new DaoGenerator().generateAll(schema, "../DaoExample/src-gen");

            当中src-gen这个文件夹名须要在执行前手动创建。否则会报错。

           假设执行后出现下面错误,则导入DaoGenerator项目的dao.ftl文件就可以(或者直接使用DaoGenerator来生成DAO文件)。

执行后出现下面的提示说明DAO文件自己主动生成成功了。刷新一下DaoExample项目就可以看到。

执行后能够看到。DaoExample项目src-gen以下自己主动生成了8个文件,3个实体对象。3个dao,1个DaoMaster,1个DaoSession.

3、创建表

创建一个实体类

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

默认表名就是类名。也能够自己定义表名

dao.setTableName("NoteList");

greenDAO会自己主动依据实体类属性创建表字段,并赋予默认值。

比如在数据库方面的表名和列名都来源于实体类名和属性名。默认的数据库名称是大写使用下划线分隔单词,而不是在Java中使用的驼峰式大写和小写风格。比如,一个名为“CREATIONDATE”属性将成为一个数据库列“CREATION_DATE”。

设置一个自增长ID列为主键:

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

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

dao.addIntProperty("cityId");

dao.addStringProperty("infoType").notNull();//非null字段

dao.addDoubleProperty("Id");

在生成的实体类中,int类型为自己主动转为long类型。

假设在编译过程中出现下面错误,那么有可能是主键的类型错误所致:

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

在使用greenDAO时,一个实体类仅仅能相应一个表。眼下没法做到一个表相应多个实体类。或者多个表共用一种对象类型。

兴许的升级也不会针对这一点进行扩展。

4、表的增删改查

增删改查相当方便。全然的面向对象。不须要涉及到不论什么的sql语言。

          查询

范例1:查询某个表是否包括某个id:

public boolean isSaved(int ID)

{

QueryBuilder<SaveList> qb = saveListDao.queryBuilder();

qb.where(Properties.Id.eq(ID));

qb.buildCount().count();

return qb.buildCount().count() > 0 ?

true : false;

}

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

public List<PhotoGalleryDB> getPhotoGallery()

{

   return photoGalleryDao.loadAll();// 获取图片相冊

}

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

/** 通过图片id查找其文件夹id */

public int getTypeId(int picId)

{

QueryBuilder<PhotoGalleryDB> qb = photoGalleryDao.queryBuilder();

qb.where(Properties.Id.eq(picId));

if (qb.list().size() > 0)

{

return qb.list().get(0).getTypeId();

}

else

{

return -1;

}

}

范例4:查找全部第一姓名是“Joe”而且以lastname排序。

List joes = userDao.queryBuilder()

.where(Properties.FirstName.eq("Joe"))

.orderAsc(Properties.LastName)

.list();

范例5:多重条件查询

(1)获取id为cityId而且infotype为HBContant.CITYINFO_SL的数据集合:

public List<CityInfoDB> getSupportingList(int cityId)

{

QueryBuilder<CityInfoDB> qb = cityInfoDao.queryBuilder();

qb.where(qb.and(Properties.CityId.eq(cityId),Properties.InfoType.eq(HBContant.CITYINFO_SL)));

qb.orderAsc(Properties.Id);// 排序根据

return qb.list();

}

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

QueryBuilder qb = userDao.queryBuilder();

qb.where(Properties.FirstName.eq("Joe"),

qb.or(Properties.YearOfBirth.gt(1970),

qb.and(Properties.YearOfBirth.eq(1970), Properties.MonthOfBirth.ge(10))));

List youngJoes = qb.list();

范例6:获取某列对象

picJsonDao.loadByRowId(picId);



5.增添/插入、改动

插入数据更加简单。也是仅仅要一句代码便能搞定!

public void addToPhotoTable(Photo p)

{

photoDao.insert(p);

}

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

DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "notes-db", null);

db = helper.getWritableDatabase();

daoMaster = new DaoMaster(db);

daoSession = daoMaster.newSession();

noteDao = daoSession.getNoteDao();

Note note = new Note(null, noteText, comment, new Date());

noteDao.insert(note);

改动更新:

photoDao.insertOrReplace(photo);

photoDao.insertInTx(photo);

6.删除:

           (1)清空表格数据

           /** 清空相冊图片列表的数据 */

           public void clearPhoto()

           {

           photoDao.deleteAll();

           }

(2)删除某个对象

 {

       QueryBuilder<DBCityInfo> qb = cityInfoDao.queryBuilder();

       DeleteQuery<DBCityInfo> bd = qb.where(Properties.CityId.eq(cityId)).buildDelete();

       bd.executeDeleteWithoutDetachingEntities();

}

由上可见,使用greenDAO进行数据库的增删改查时及其方便,并且性能极佳。

三、经常用法笔记

1.在Application实现得到DaoMaster和DaoSession的方法:

private static DaoMaster daoMaster;

private static DaoSession daoSession;

/**

* 取得DaoMaster

*

* @param context

* @return

*/

public static DaoMaster getDaoMaster(Context context)

{

if (daoMaster == null)

{

OpenHelper helper = new DaoMaster.DevOpenHelper(context, HBContant.DATABASE_NAME, null);

daoMaster = new DaoMaster(helper.getWritableDatabase());

}

return daoMaster;

}

/**

* 取得DaoSession

*

* @param context

* @return

*/

public static DaoSession getDaoSession(Context context)

{

if (daoSession == null)

{

if (daoMaster == null)

{

daoMaster = getDaoMaster(context);

}

daoSession = daoMaster.newSession();

}

return daoSession;

}

2.增删改查工具类:

public class DBHelper

{

private static Context mContext;

private static DBHelper instance;

 

private CityInfoDBDao cityInfoDao;

 

private DBHelper()

{

}

 

public static DBHelper getInstance(Context context)

{

if (instance == null)

{

instance = new DBHelper();

if (mContext == null)

{

mContext = context;

}

 

// 数据库对象

DaoSession daoSession = HBApplication.getDaoSession(mContext);

instance.cityInfoDao = daoSession.getCityInfoDBDao();

}

return instance;

}

 

/** 加入数据 */

public void addToCityInfoTable(CityInfo item)

{

cityInfoDao.insert(item);

}

 

/** 查询 */

public List<EstateLoveListJson> getCityInfoList()

{

QueryBuilder<CityInfo> qb = cityInfoDao.queryBuilder();

return qb.list();

}

 

/** 查询 */

public List<CityInfo> getCityInfo()

{

return cityInfoDao.loadAll();// 查找图片相冊

}

 

/** 查询 */

public boolean isSaved(int Id)

{

QueryBuilder<CityInfo> qb = cityInfoDao.queryBuilder();

qb.where(Properties.Id.eq(Id));

qb.buildCount().count();

return qb.buildCount().count() > 0 ? true : false;// 查找收藏表

}

 

/** 删除 */

public void deleteCityInfoList(int Id)

{

QueryBuilder<CityInfo> qb = cityInfoDao.queryBuilder();

DeleteQuery<CityInfo> bd = qb.where(Properties.Id.eq(Id)).buildDelete();

bd.executeDeleteWithoutDetachingEntities();

}

 

/** 删除 */

public void clearCityInfo()

{

cityInfoDao.deleteAll();

}

 

/** 通过城市id查找其类型id */

public int getTypeId(int cityId)

{

QueryBuilder<CityInfo> qb = cityInfoDao.queryBuilder();

qb.where(Properties.Id.eq(cityId));

if (qb.list().size() > 0)

{

return qb.list().get(0).getTypeId();

}

else

{

return 0;

}

}

 

/** 多重查询 */

public List<CityInfo> getIphRegionList(int cityId)

{

QueryBuilder<CityInfoDB> qb = cityInfoDao.queryBuilder();

qb.where(qb.and(Properties.CityId.eq(cityId), Properties.InfoType.eq(HBContant.CITYINFO_IR)));

qb.orderAsc(Properties.Id);// 排序根据

return qb.list();

}

}

       另外。还有多表关联、惰性载入等功能,待兴许研究。

參考资料:

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

Android开发数据库之第三方ORM框架(GreenDao)的更多相关文章

  1. ORM框架--GreenDao 3.0基本使用指南

    0. ORM框架--GreenDao 3.0基本使用指南 1. Gradle 的配置 这里可以参照官方的文档进行最新的配置(本示例的版本等你看到可能就不是最新的了),但是值得注意的一点是,GreenD ...

  2. Android开发数据库三层应用-DataSnap

    Android开发数据库三层应用-DataSnap http://www.2ccc.com/news/Html/?1517.html 核心提示:我觉得Delphi最强大的的功能之一就是开发数据库三层应 ...

  3. Android 数据库ORM框架GreenDao学习心得及使用总结<一>

    转: http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁的读 ...

  4. 【转载】Android开源:数据库ORM框架GreenDao学习心得及使用总结

    转载链接:http://www.it165.net/pro/html/201401/9026.html 最近在对开发项目的性能进行优化.由于项目里涉及了大量的缓存处理和数据库运用,需要对数据库进行频繁 ...

  5. 数据库ORM框架GreenDao

    常用的数据库: 1). Sql Server2). Access3). Oracle4). Sysbase5). MySql6). Informix7). FoxPro8). PostgreSQL9) ...

  6. Android开发三种第三方图片加载的框架

    最近在项目中用到了大量图片加载,第三方优秀框架还不错,下面介绍三款榜首的框架用法和问题,做一个记录. 现在项目使用的是Android Studio开发的,现在也没有多少人使用Eclipse了吧. 一. ...

  7. 对象关系映射(ORM)框架GreenDao简介和基本使用

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

  8. ORM框架greenDao 2 (用于了解旧版本的使用方法,目前最新版本为3.2.2,使用注释的方式来生成)

    摘要: Android中对SQLite数据库使用,是一件非常频繁的事情.现今,也有非常多的SQLite处理的开源框架,其中最著名的greenDao,它以占用资源少,处理效率高等特点,成为优秀的ORM框 ...

  9. Android 自定义Android ORM 框架greenDAO数据库文件的路径

    import android.content.Context; import android.content.ContextWrapper; import android.database.Datab ...

随机推荐

  1. ECNUOJ 2573 Hub Connection plan

    Hub Connection plan Time Limit:1000MS Memory Limit:65536KB Total Submit:743 Accepted:180 Description ...

  2. Dig A Well For Yourself

    See Paul's essay:  , I found paul is a genius, double checking. Mars June 2015

  3. Atitit.软件开发的终于的设计&#160;dsl化,ast化(建立ast,&#160;解析运行ast)

    Atitit.软件开发的终于的设计 dsl化,ast化(建立ast, 解析运行ast) 1. 使用js,html 撰写dsl 1 1.1. 架构图 1 1.2. html 2 1.3. Js 2 1. ...

  4. 制作自己的特色PE----Mr.Zhang

    必备的文件和工具 win7.iso/win8.iso Windows系统ISO镜像 WimTool BOOT.WIM文件的改动 RegWorkShop 注冊表编辑和分析利器 UltraISO 改动wi ...

  5. Codeforces 11B Jumping Jack(数学)

    B. Jumping Jack time limit per test 1 second memory limit per test 64 megabytes input standard input ...

  6. 14.c语言dll注入

    #include <Windows.h> //dll不需要main函数 //导出接口 _declspec(dllexport) void go() { MessageBoxA(, ); }

  7. spring之DelegatingFilterProxy

    DelegatingFilterProxy是一个标准servlet Filter的代理,代理实现了Filter接口的spring管理的Bean.支持一个在web.xml的init-param定义的&q ...

  8. 1.9 Python基础知识 - 数值运算

      一.数值运算 在Python中有丰富的算术运算,这使得Python在科学计算领域有着很高的地位,Python可以提供包括四则运算在内的各种算术运算. 算术运算符 运算符 含义 说明 优先级 实例 ...

  9. java中replaceAll反斜杠\ or java中replaceAll 括号[

    java中replaceAll反斜杠\   String s=new String("this is a \\"); s.replaceAll("\\",&qu ...

  10. 动态调用web服务 --WSHelper.cs

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Net;us ...