• 关于ORM的介绍
  • GreenDao概念
    • GreenDao设计目标和优点
  • GreenDao322的集成和使用
    • 1 添加依赖
    • 2 使用GreenDao3注解的语法来定义数据库实体类
      • 定义实体类和主键ID等变量
      • 通过MakeProject自动生成类文件和实体类的getset方法
    • 3 GreenDao3X数据库操作方法
      • 1 创建GreenDaoManager类用于创建数据库创建数据库表包含增删改查的操作以及数据库的升级
      • 2 创建实体类DaoUtil用于完成对某一张数据表的具体操作ORM操作以创建SearchHistoryDaoUtil为例
    • 4 GreenDao的具体使用
  • 注意事项

关于ORM的介绍:

ORM(Object Relational Mapping)框架采用元数据来描述对象一关系映射细节,元数据一般采用XML格式,并且存放在专门的对象一映射文件中。是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。
面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的. 两者之间是不匹配的.而ORM作为项目中间件形式实现数据在不同场景下数据关系映射. 对象关系映射是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术.ORM就是这样而来的。

GreenDao概念:

GreenDAO是一个开源的安卓ORM框架,能够使SQLite数据库的开发再次变得有趣。它减轻开发人员处理低级数据库需求,同时节省开发时间。 SQLite是一个令人敬畏的内嵌的关系数据库,编写SQL和解析查询结果是相当乏味和耗时的任务。通过将Java对象映射到数据库表(称为ORM,“对象/关系映射”),GreenDAO可以将它们从这些映射中释放出来,这样,您可以使用简单的面向对象的API来存储,更新,删除和查询数据库。
简单的讲,GreenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。

GreenDao设计目标和优点

官网设计目标:
是Android的一个轻快的ORM,它将对象映射到SQLite数据库。 针对Android的高度优化,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:较小的文件体积,只集中在必要的部分上。
优点:
坚如磐石:greenDAO自2011年以来一直在使用,并被无数的着名应用程序使用
超级简单:在V3中带有注释的简洁而直接的API
小:库是<150K,它只是简单的Java jar(不依赖于CPU的本机部分)
快速:可能是Android智能代码生成驱动的最快的ORM
安全和富有表现力的查询API:QueryBuilder使用属性常量来避免拼写错误
强大的连接:跨实体查询,甚至是复杂关系的连锁连接
灵活的属性类型:使用自定义类或枚举来表示实体中的数据
加密:支持SQLCipher加密数据库

GreenDao3.2.2的集成和使用

整体来说,集成后一共会有至少6个类文件,三个自动生成,三个手动配置创建,以下内容均是根据这些类来操作,结构不清楚请参考下图:

1、 添加依赖:

// In your root build.gradle file:项目project根目录下的的build.gradle文件
buildscript {repositories {jcenter()mavenCentral() // add repository}dependencies {classpath 'com.android.tools.build:gradle:2.3.0'classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin}
}// In your app projects build.gradle file:APPmodule下的build.gradle文件
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugindependencies {compile 'org.greenrobot:greendao:3.2.2' // add library
}

另外,在APPmodule下的build.gradle文件的android{}同级目录下添加配置:

/*** schemaVersion:指定数据库schema版本号,迁移等操作会用到;*  daoPackage:通过gradle插件生成的数据库相关文件的包名,默认为你的entity所在的包名;*  targetGenDir:自定义生成数据库文件的目录,可以将生成的文件放到我们的java目录中,而不是build中,*  这样就不用额外的设置资源目录了。*/
greendao {schemaVersion 1
//    daoPackage 'com.ping.greendao.gen'daoPackage 'com.lab.web.entity.greendao'targetGenDir 'src/main/java'
}

2、 使用GreenDao3注解的语法来定义数据库实体类;

① 定义实体类和主键ID等变量

注意,此处我们只需要定义类名,加上@Entity注解和参数名即可,不用手动生成构造函数和get,set方法。

② 通过MakeProject自动生成类文件和实体类的get,set方法

此时点击AS中的MakeProject按钮,GreenDao会为我们的实体类生成对应的Getter、Setter方法以及两个构造函数,同时在我们配置的com.ping.greendao.gen包下生成了三个对应类文件DaoMaster、DaoSession和MeiziDao,之后所有相关的数据库操作都依靠这三个文件了;
这里再提一下,生成的三个类文件的路径和APPmodule的build.gradle文件中的greendao{}配置的路径有关系,如果没有配置就会生成在APP下的build文件夹中,这样多少有些膈应,所以还是配置一下路径比较安心。此步骤完成效果后如下图:


其中实体类完成代码:

package com.lab.web.entity.greendaoentity;import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Generated;/*** Created by ytf on 2018/2/8.*/
@Entity
public class SearchHistroyEntry {@Id(autoincrement = true)private Long search_id;private String histry_searchStr;@Generated(hash = 250291344)public SearchHistroyEntry(Long search_id, String histry_searchStr) {this.search_id = search_id;this.histry_searchStr = histry_searchStr;}@Generated(hash = 237453182)public SearchHistroyEntry() {}public Long getSearch_id() {return this.search_id;}public void setSearch_id(Long search_id) {this.search_id = search_id;}public String getHistry_searchStr() {return this.histry_searchStr;}public void setHistry_searchStr(String histry_searchStr) {this.histry_searchStr = histry_searchStr;}}

PS :DaoMaster、DaoSession、实体类DAO的作用:

DaoMaster:使用greenDAO的切入点。DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的DAO类(而不是对象)。 它具有静态方法来创建表或将它们删除。 其内部类OpenHelper和DevOpenHelper是在SQLite数据库中创建模式的SQLiteOpenHelper实现。一个DaoMaster就代表着一个数据库的连接。
DaoSession:管理特定模式的所有可用DAO对象,您可以使用其中一个getter方法获取。 DaoSession还为实体提供了一些通用的持久性方法,如插入,加载,更新,刷新和删除。 DaoSession可以让我们使用一些Entity的基本操作和获取Dao操作类,DaoSession可以创建多个,每一个都是属于同一个数据库连接的。
实体类DAO:数据访问对象(DAO)持续存在并查询实体。 对于每个实体,GreenDAO生成一个DAO。 它比DaoSession有更多的持久化方法,例如:count,loadAll和insertInTx。

3、 GreenDao3.X数据库操作方法

1、 创建GreenDaoManager类,用于创建数据库、创建数据库表、包含增删改查的操作以及数据库的升级。

package com.lab.web.entity.greendaoentity;import android.content.Context;import com.lab.web.entity.greendao.DaoMaster;
import com.lab.web.entity.greendao.DaoSession;import org.greenrobot.greendao.query.QueryBuilder;/*** 用于创建数据库、创建数据库表、包含增删改查的操作以及数据库的升级。* Created by ytf on 2018/2/8.*/public class GreenDaoManager {private static final String TAG = GreenDaoManager.class.getSimpleName();private static final String DB_NAME = "search_history";private Context context;//多线程中要被共享的使用volatile关键字修饰private volatile static GreenDaoManager manager = new GreenDaoManager();private static DaoMaster sDaoMaster;private static DaoMaster.DevOpenHelper sHelper;private static DaoSession sDaoSession;public void init(Context context){this.context = context;}/*** 单例模式获得操作数据库对象* @return*/public static GreenDaoManager getInstance(){return manager;}/*** 判断是否有存在数据库,如果没有则创建* @return*/public DaoMaster getDaoMaster(){if(sDaoMaster == null) {DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, DB_NAME, null);com.orhanobut.logger.Logger.i("context="+context.toString());sDaoMaster = new DaoMaster(helper.getWritableDatabase());}return sDaoMaster;}/*** 完成对数据库的添加、删除、修改、查询操作,仅仅是一个接口* @return*/public DaoSession getDaoSession(){if(sDaoSession == null){if(sDaoMaster == null){sDaoMaster = getDaoMaster();}sDaoSession = sDaoMaster.newSession();}return sDaoSession;}/*** 打开输出日志,默认关闭*/public void setDebug(){QueryBuilder.LOG_SQL = true;QueryBuilder.LOG_VALUES = true;}public void closeHelper(){if(sHelper != null){sHelper.close();sHelper = null;}}public void closeDaoSession(){if(sDaoSession != null){sDaoSession.clear();sDaoSession = null;}}/*** 关闭所有的操作,数据库开启后,使用完毕要关闭*/public void closeConnection(){closeHelper();closeDaoSession();}}

2、 创建实体类DaoUtil,用于完成对某一张数据表的具体操作——ORM操作。以创建SearchHistoryDaoUtil为例:

package com.lab.web.entity.greendaoentity;
import android.content.Context;import com.lab.web.entity.greendao.DaoMaster;
import com.lab.web.entity.greendao.SearchHistroyEntryDao;
import com.orhanobut.logger.Logger;import org.greenrobot.greendao.query.QueryBuilder;import java.util.List;/*** Created by ppg on 2018/2/8.*/public class SearchHistoryDaoUtil {private static final String TAG = SearchHistoryDaoUtil.class.getSimpleName();private GreenDaoManager mManager;public SearchHistoryDaoUtil(Context context) {this.mManager =GreenDaoManager.getInstance() ;//不要忘记初始化GreenDaoManagerthis.mManager.init(context);}/*** 完成搜索记录的插入,如果表未创建,先创建Meizi表* @param searchHistroyEntry* @return*/public boolean insertSearchHistroyEntry(SearchHistroyEntry searchHistroyEntry){boolean flag = false;flag = mManager.getDaoSession().getSearchHistroyEntryDao().insert(searchHistroyEntry) == -1 ? false : true;Logger.i(TAG, "insert SearchHistroyEntry :" + flag + "-->" + searchHistroyEntry.toString());return flag;}/*** 插入多条数据,在子线程操作* @param sheList* @return*/public boolean insertMultSearchHistroyEntry(final List<SearchHistroyEntry> sheList) {boolean flag = false;try {mManager.getDaoSession().runInTx(new Runnable() {@Overridepublic void run() {for (SearchHistroyEntry searchHistroyEntry : sheList) {mManager.getDaoSession().insertOrReplace(searchHistroyEntry);}}});flag = true;Logger.i(TAG, "insert SearchHistroyEntry :" + flag + "-->" + sheList.toString());} catch (Exception e) {e.printStackTrace();}return flag;}/*** 修改一条数据* @param searchHistroyEntry* @return*/public boolean updateSearchHistroyEntry(SearchHistroyEntry searchHistroyEntry){boolean flag = false;try {mManager.getDaoSession().update(searchHistroyEntry);flag = true;}catch (Exception e){e.printStackTrace();}return flag;}/*** 删除单条记录* @param searchHistroyEntry* @return*/public boolean deleteSearchHistroyEntry(SearchHistroyEntry searchHistroyEntry){boolean flag = false;try {//按照id删除mManager.getDaoSession().delete(searchHistroyEntry);flag = true;}catch (Exception e){e.printStackTrace();}return flag;}/*** 删除所有记录* @return ture为删除成功*/public boolean deleteAll(){boolean flag = false;try {//按照id删除mManager.getDaoSession().deleteAll(SearchHistroyEntry.class);flag = true;}catch (Exception e){e.printStackTrace();}return flag;}/*** 使用native sql进行查询操作*/public List<SearchHistroyEntry> querySearchHistroyEntryByNativeSql(String sql, String[] conditions){return mManager.getDaoSession().queryRaw(SearchHistroyEntry.class, sql, conditions);}/*** 使用queryBuilder进行查询* @return*/public List<SearchHistroyEntry> querySearchHistroyEntryByQueryBuilder(long id){QueryBuilder<SearchHistroyEntry> queryBuilder = mManager.getDaoSession().queryBuilder(SearchHistroyEntry.class);return queryBuilder.where(SearchHistroyEntryDao.Properties.Search_id.eq(id)).list();}/*** 查询所有搜索记录* @return*/public List<SearchHistroyEntry> queryAllSearchHistroyEntry(){return mManager.getDaoSession().loadAll(SearchHistroyEntry.class);}/*** 根据主键id查询记录* @param key* @return*/public SearchHistroyEntry querySearchHistroyEntryById(long key){return mManager.getDaoSession().load(SearchHistroyEntry.class, key);}}

至此集成和配置工作就可以说结束了,然后就是初始化创建数据库文件和操作数据库的问题了,说白了就是各种调方法。示例如下:

4、 GreenDao的具体使用:

/GreenDao初始化searchHistoryDaoUtil=new SearchHistoryDaoUtil(this);searchHistoryDaoUtil.deleteAll();searchHistoryDaoUtil.insertSearchHistroyEntry(new SearchHistroyEntry(1001L,"碰碰购"));Logger.i("插入一条碰碰购");List<SearchHistroyEntry> searchHistroyEntriesList = new ArrayList<>();searchHistroyEntriesList.add(new SearchHistroyEntry(1002L,"画江湖"));searchHistroyEntriesList.add(new SearchHistroyEntry(1003L,"侠岚"));searchHistroyEntriesList.add(new SearchHistroyEntry(1004L,"若森"));searchHistroyEntriesList.add(new SearchHistroyEntry(1005L,"秦时明月"));searchHistroyEntriesList.add(new SearchHistroyEntry(1006L,"天行九歌"));searchHistoryDaoUtil.insertMultSearchHistroyEntry(searchHistroyEntriesList);Logger.i("当前数据库条目数量:"+searchHistroyEntriesList.size());
private void checkAllSearchCode() {List<SearchHistroyEntry> searchHistroyEntries = MyApplication.getInstance().searchHistoryDaoUtil.queryAllSearchHistroyEntry();mVals = new String[searchHistroyEntries.size()];for (int i = 0; i < searchHistroyEntries.size(); i++) {mVals[i] = searchHistroyEntries.get(i).getHistry_searchStr();Logger.i("条目ID:"+searchHistroyEntries.get(i).getSearch_id());}Logger.i("数据库总条目:"+searchHistroyEntries.size());}

注意事项:

如果你是要在项目启动的时候就初始化数据库,那么要考虑一个问题,就是你的项目中是否集成了别的基于反射的安卓框架,比如说腾讯的Bugly热修复等等,因为既然是基于反射,那么application类中的onCreate方法就不会只执行一次,所以如果在此处初始化数据库并添加内容的话,就要酌情考虑你的数据库内容会不会重复,如果没有指定主键ID的值就会重复内容,如果指定了ID的值就会因为重复加载相同ID的内容而在二次启动时候报错,所以如果数据量不是很大,建议写入数据库之前先清除里边内容,以防万一。毕竟写个删除数据的操作还是很简单的。
GreenDao官网
GreenDao的GitHub网址

安卓轻量级数据库框架-GreenDao3.2.2集成方案相关推荐

  1. 安卓本地轻量级数据库操作框架 greenDao3.2.2 详细教程附带Demo①——集成环境,开辟难题。

    欢迎安卓本地轻量级数据库操作框架 greenDao3.2.2 学习之旅. 本套框架博客系列博客目录: 第一篇:认识 greenDao3.2.2 框架,集成环境,开辟难题. 第二篇:简单的进行 增.删. ...

  2. php mysql 框架_Medoo 轻量级的 PHP 数据库框架 - 文章

    Medoo 是一个轻量级的PHP数据库框架,提高开发效率,Medoo 需要 PHP 支持 PDO 扩展,请在配置文件中开启 PDO 扩展. 为什么选择 Medoo 非常的轻量 未压缩只有 34KB. ...

  3. 安卓进阶系列-07数据库框架(GreenDAO)的使用

    GreenDAO的使用 简介 安卓提供了一个占用内存极小的数据库SQLite,也提供了不少操作数据库的API,然而不是所有程序员都擅长编写SQL语句,这时一个ORM的数据库框架就显得很好用了. 在之前 ...

  4. 安卓进阶系列-06数据库框架(LitePal)的使用

    LitePal的使用 背景 安卓内置了一个轻量数据库SQLite,然而很多时候使用SQLite是不方便的,更多开发者习惯服务器部署MySQL之类的数据库,而且复杂的SQL语言对于很多没有系统学习过数据 ...

  5. Medoo 开源项目发布,超轻量级的PHP SQL数据库框架

    Medoo是一款超轻量级的PHP SQL数据库框架,由社交网站Catfan和开源项目Qatrix的创始人黎言卓开发.提供了简单,易学,灵活的API,提升开发Web应用的效率与性能,而且体积只有8KB不 ...

  6. GreenDao3.2.2集成使用以及数据库的升级

    GreenDao3.2.2集成使用以及数据库的升级 一概念      是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案.                            ...

  7. Android数据库框架总结

    本文转自:http://blog.csdn.net/da_caoyuan/article/details/61414626 一:OrmLite 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封 ...

  8. Android数据库框架-----ORMLite 的基本用法

    ORMLite 是一款非要流行的Android平台上的数据库框架,性能优秀,代码简洁: 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完善:4.文档全面. 缺点:1.基于反射,效率较低(本 ...

  9. sqlite java框架_SQlite数据库框架:LitePal

    常用的数据库框架 Android的发展的速度是难以置信的,Android出来哪一年我还在小学上学很,还能很清楚的记得,那年一切,但是那个时候的我怎么可能也不会想到自己将来会要去做Android.And ...

最新文章

  1. layer弹出层闪退_layer弹出层详解
  2. 亚太信息安全领袖成就表彰计划:阿里成中国互联网公司唯一代表
  3. 搭建Modelsim SE仿真环境-使用do文件仿真
  4. ExtJS4.2:自定义主题 入门
  5. 万年历c语言编程代码_C语言高效编程与代码优化~
  6. 关于多线程的一个例子(UI实时显示)
  7. Angular list列表绑定的一个例子
  8. Python中执行外部命令
  9. c语言万年历报告ppt,万年历设计报告
  10. sscanf_s函数
  11. 思科与华为常用交换机产品线介绍
  12. pcap报文80211-8023区别
  13. 洛谷 P4578 [FJOI2018] Upc6605 福建OI2018 所罗门王的宝藏
  14. 某百度程序员:每天十点上班,午休两小时,每天闲逛,晚上八点就下班!
  15. ad7606与stm32连接电路介绍
  16. php手机投屏功能,电脑手机投屏怎么操作设置?
  17. 卷积神经网络Convolutional Neural Networks深度解析I
  18. 基于RC电路的DA14585测量NTC电阻阻值
  19. 最全数学各个分支简介
  20. 简述什么是人工神经网络,人工神经网络基本构成

热门文章

  1. 机器学习之Ensemble(Bagging、AdaBoost、GBDT、Stacking)
  2. 教你用Python一行代码制作20款经典小游戏~
  3. 回车换行0x0D和0x0A 小谈
  4. arcgis获取某个区域中心点的经纬度
  5. win10 64位 我们无法设置移动热点 解决方案
  6. 文艺平衡树(Splay)
  7. ECS 7天实践训练营——Day3 SLB负载均衡实践
  8. Win10安装wordcloud(词云)的方法
  9. 四元数左乘右乘_四元数——旋转
  10. 【css】h5cs3新特性