android高效ORM数据库框架greenDao使用

时间:2015-06-22 20:40:54      阅读:7567      评论:0      收藏:0      [点我收藏+]

标签:android   class   style   log   com   代码   使用   http   src

因为项目中多处用到了数据库,需要对数据库频繁的读写操作,虽然android 自带的SQLiteOpenHelper的.这种方式比较方便易懂,但是在使用过程中需要写很多的sql语句,而且需要及时的关闭和释放资源,使用起来相对复杂,鉴于性能的考虑,决定采用一种ORM框架来解决,

在android中开源的数据库ORM解决方案中.主要有那么几种.综合各方面评价,觉得greenDao相对来说是一个综合考量最好的方案,所以决定试一下,

但是greenDao使用相关资料网上确实不多,仅有的官网介绍也是言简意赅,自己捣鼓了下,也算是实现了相关的功能,而且性能还是不错的,记录一下.以防不时之需.\

一: greenDao介绍

1. 官网:http://greendao-orm.com/,从官网的图片看出还是相当小清新的哈,

2,项目下载地址:https://github.com/greenrobot/greenDAO(github),也可以选择在官网下载.

3.greenDAO的主要设计目标: 
      *最大性能(最快的 Android ORM)  
      *易于使用API 
      *高度优化 
      *最小内存消耗

二: 实例

好了,废话不多说,先看一下官方文档的介绍入手来进行greenDao的使用,首先下载相关工程项目.官网上的指引,也是叫我们上github下载,下载下来是包含了好几个工程的,因为项目比较老了,所以采用的是eclipse结构的,我们可以使用eclipse直接导入 使用,其中包括:

DaoCore :库文件源代码.编译后的jar包导入项目即可使用.

DaoExample:这个就是sample了.

DaoExampleGenerator:DaoExample工程的DAO类构造器,java工程,用于生成数据库相关文件.

DaoTest、PerformanceTestOrmLite:其他测试相关的工程

ExampleDaoGenerator

/** Copyright (C) 2011 Markus Junginger, greenrobot (http://greenrobot.de)** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**      http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/
package de.greenrobot.daogenerator.gentest;import de.greenrobot.daogenerator.DaoGenerator;
import de.greenrobot.daogenerator.Entity;
import de.greenrobot.daogenerator.Property;
import de.greenrobot.daogenerator.Schema;
import de.greenrobot.daogenerator.ToMany;/*** Generates entities and DAOs for the example project DaoExample.* * Run it as a Java application (not Android).* * @author Markus*/
public class ExampleDaoGenerator {public static void main(String[] args) throws Exception {
// //第一个参数是DB的版本号,通过更新版本号来更新数据库。第二个参数是自动生成代码的包路径
Schema schema = new Schema(1000, "de.greenrobot.daoexample");addNote(schema);addCustomerOrder(schema);// 希望自动生成的代码对应的项目路径//src-gen这个文件夹必须手动创建,这里路径如果错了会抛出异常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);}}

greenDao 使用的难点其实就是入门,最开始需要创建一个如上的 Java工程来生成相应的DaoMaster,DaoSession,.和相应的JavaBean及DAO.

通过addIdProperty(); 添加ID属性,如果希望是自增长的,则需要添加上autoincrement();即可.

同时,支持很多中数据类型.可以通过添加notNull() 和unique() ;添加非空和唯一性约束.

note.addStringProperty("noteId").notNull().unique();  note.addBooleanProperty("isNew");  note.addStringProperty("text");note.addStringProperty("type");

此Java工程需要导入greendao-generator-1.3.1.jar jar包.Java工程创建好了之后,就可以运行他了,此时,如果生成了类似一下的日志,则说明创建成功了

greenDAO Generator
Copyright 2011-2013 Markus Junginger, greenrobot.de. Licensed under GPL V3.
This program comes with ABSOLUTELY NO WARRANTY
Processing schema version 3...
Written F:Android_Exwork_10DaoExamplesrc-gendegreenrobotdaoexampleNoteDao.java
Written F:Android_Exwork_10DaoExamplesrc-gendegreenrobotdaoexampleNote.java
Written F:Android_Exwork_10DaoExamplesrc-gendegreenrobotdaoexampleCustomerDao.java
Written F:Android_Exwork_10DaoExamplesrc-gendegreenrobotdaoexampleCustomer.java
Written F:Android_Exwork_10DaoExamplesrc-gendegreenrobotdaoexampleOrderDao.java
Written F:Android_Exwork_10DaoExamplesrc-gendegreenrobotdaoexampleOrder.java
Written F:Android_Exwork_10DaoExamplesrc-gendegreenrobotdaoexampleDaoMaster.java
Written F:Android_Exwork_10DaoExamplesrc-gendegreenrobotdaoexampleDaoSession.java
Processed 3 entities in 204ms

有时,也可能出现类似下面的错误/

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)

这是很常见的io异常,看看是否目标文件夹没有创建的缘故,抑或clean一下试试.

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

三: 增删改查

greenDao对数据库表的操作也是相当的方便,完全的面向对象,不用写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;
}

我们需要利用一个叫做QueryBuilder 的东西,这个东西是可以重复利用的,因此在后面我们需要创建一个工具类来将这些数据库的操作封装起来.

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. 多重条件查询,获取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();

二增添/插入、修改

1. 插入数据更加简单,也是只要一句代码便能搞定!插入时需要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);

2.修改更新:

photoDao.insertOrReplace(photo);
photoDao.insertInTx(photo);

三:删除

1. 清除数据库

/** 清空相册图片列表的数据 */
public void clearPhoto(){photoDao.deleteAll();
}

2. 删除某个对象

public void deleteCityInfo(int cityId){
QueryBuilder<DBCityInfo> qb = cityInfoDao.queryBuilder();
DeleteQuery<DBCityInfo> bd = qb.where(Properties.CityId.eq(cityId)).buildDelete();
bd.executeDeleteWithoutDetachingEntities();
}

更多用法参考:http://greendao-orm.com/documentation/

四: 常用方法总结

package com.example.drugazdbdemo;import android.app.Application;
import android.content.Context;import com.example.drugazdbdemo.DaoMaster.OpenHelper;public class BaseApplication extends Application {private static BaseApplication mInstance;private static DaoMaster daoMaster;private static DaoSession daoSession;@Overridepublic void onCreate() {super.onCreate();if (mInstance == null)mInstance = this;}/*** 取得DaoMaster* * @param context* @return*/public static DaoMaster getDaoMaster(Context context, String TABLENAME) {if (daoMaster == null) {OpenHelper helper = new DaoMaster.DevOpenHelper(context, TABLENAME,null);daoMaster = new DaoMaster(helper.getWritableDatabase());}return daoMaster;}/*** 取得DaoSession* * @param context* @return*/public static DaoSession getDaoSession(Context context, String TABLENAME) {if (daoSession == null) {if (daoMaster == null) {daoMaster = getDaoMaster(context, TABLENAME);}daoSession = daoMaster.newSession();}return daoSession;}
}

一般情况下.我们需要新建一个BaseApplication类继承自Application,这样的话,可以减少重复新建DaoMaster和DaoSession.

同时,我们可以新建一个泛型类来操作数据库,,封装数据库的增删改查方法./

package com.yaodu.drug.database;import android.content.Context;import com.yaodu.application.MyApplication;import java.util.List;import de.greenrobot.dao.AbstractDao;
import de.greenrobot.dao.query.DeleteQuery;
import de.greenrobot.dao.query.QueryBuilder;
import de.greenrobot.dao.query.WhereCondition;@SuppressWarnings({"rawtypes", "unchecked"})
public class DbService<T> {private static DbService instance;private DaoSession mDaoSession;private AbstractDao<T, Long> tDao;private DbService() {}public static DbService getInstance(Context context, String TABLENAME,Class bean) {if (instance == null) {instance = new DbService();}instance.mDaoSession = MyApplication.getDaoSession(context, TABLENAME);instance.tDao = instance.mDaoSession.getDao(bean);return instance;}public List<T> loadAllT() {return tDao.loadAll();}public List<T> queryTLists(WhereCondition where) {QueryBuilder<T> builder = instance.tDao.queryBuilder();return builder.where(where).list();}public List<T> queryTLists(QueryBuilder<T> builder,WhereCondition where){return builder.where(where).list();}public QueryBuilder<T> getQueryBuilder(){return instance.tDao.queryBuilder();}public T updateT(T t) {tDao.update(t);return t;}/*** insert or update noteList use transaction*/public void saveTLists(final List<T> list) {if (list == null || list.isEmpty()) {return;}tDao.getSession().runInTx(new Runnable() {@Overridepublic void run() {for (int i = 0; i < list.size(); i++) {T t = list.get(i);tDao.insertOrReplace(t);}}});}public void deleteById(String mId) {QueryBuilder<T> builder = instance.tDao.queryBuilder();DeleteQuery<T> bd = builder.where(tDao.getProperties()[1].eq(mId)).buildDelete();bd.executeDeleteWithoutDetachingEntities();}}

android高效ORM数据库框架greenDao使用

标签:android   class   style   log   com   代码   使用   http   src

原文:http://www.cnblogs.com/BoBoMEe/p/4593684.html

android高效ORM数据库框架greenDao使用相关推荐

  1. Android高性能ORM数据库DBFlow入门

    DBFlow,综合了 ActiveAndroid, Schematic, Ollie,Sprinkles 等库的优点.同时不是基于反射,所以性能也是非常高,效率紧跟greenDAO其后.基于注解,使用 ...

  2. Python-Sqlalchemy(ORM数据库框架)

    文章目录 python-Sqlalchemy(ORM数据库框架) 概念和数据类型 安装 连接 创建数据库表类(模型) 生成数据库表 会话 增删改查 增 查 改 删 执行裸sql with关闭会话 sq ...

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

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

  4. Android开源库--ActiveAndroid(active record模式的ORM数据库框架)

    Github地址:https://github.com/pardom/ActiveAndroid 前言 我一般在Android开发中,几乎用不到SQLlite,因为一些小数据就直接使用Preferen ...

  5. Android数据库框架-GreenDao入门,阿里P8架构师Android大厂面试题总结

    // in the individual module build.gradle files } } 之后点击Sync Project 2.2. 在app的build.gradle中配置 apply ...

  6. Android使用OrmLite数据库框架 之 基本用法

    官网:http://ormlite.com/ 官方帮助,目录: http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_toc.html#S ...

  7. android dbflow教程,Android高性能ORM数据库DBFlow入门教程

    一.引入依赖.初始化 需要引入apt和maven,配置项目的 build.gradle buildscript { repositories { jcenter() } dependencies { ...

  8. 安卓:Kotlin数据库框架GreenDao的使用

    优势: 1.存取速度快; 2.支持数据库加密; 3.轻量级; 4.激活实体; 5.支持缓存; 6.代码自动生成: 导入依赖: 项目中: buildscript {repositories {googl ...

  9. Android开发 Room数据库框架

    Room框架 Room数据库是基于SQLite数据库的一种框架,由谷歌推出, 主要有三个部分组成: Entity(一个Entity对应数据库中的一张表.Entity类是Sqlite表结构对Java类的 ...

  10. Android GreenDao数据库框架

    ## Android GreenDao数据库框架 GreenDao简介 Android平台的对象关系映射工具(ORM) 为关系型数据库提供面向对象的接口 简化数据库操作 ORM框架 所谓ORM框架,即 ...

最新文章

  1. 16.编译错误Unknown CMake command “check_symbol_exists“解决
  2. 对C#面向对象三大特性的一点总结
  3. JQUERY AJAX无刷新异步上传文件
  4. PostgreSQL连接问题(Net LO problem)
  5. 20200426:186周周赛(上)(leetcode5392-5394)
  6. 最好用的WIN7 系统下载
  7. 如何判断电脑是否中毒(转)
  8. 操作系统实验及代码(全)
  9. GTRD:最全面的人和小鼠转录因子chip_seq数据库
  10. Apache探索:Windows下搭建PHP运行环境(详细图文教程)
  11. 口袋的天空(洛谷 P1195)
  12. 入手评测华为nova10和vivoS15pro选哪个
  13. 《自来水哲学-松下幸之助自传》读后感
  14. 数据通信与网络教材目录
  15. 换个格式输出整数 蓝桥杯 C语言
  16. string刷题集合
  17. 双曲线知识的简单回顾
  18. R语言 DESeq2 基因差异分析 简单备注版 火山图
  19. python两个小于号什么意思_python中的不等于号是什么
  20. matlab中有虚数j吗,在MATLAB中用虚数部分对复数数组元素排序

热门文章

  1. 最强的右键菜单工具:超级右键专业版 mac中文版
  2. 百度NLP架构与应用
  3. percentile函数mysql_SQL使用窗口函数计算百分位数
  4. opa847方波放大电路_用运算放大器获得三角波、正弦波、方波的简易实用电路
  5. AI代替法官?你了解智慧司法的建设与应用吗
  6. 2019 “钱”途光明的 8 大前端开发技术,你还差几个?
  7. 开源无线管理软件_开源无线电系统向育空地区及其他地区提供紧急警报和音乐
  8. Android仿网易云项目代码,Android项目实战教程之高仿网易云音乐启动页实例代码...
  9. 【Feign请求头丢失问题】no suitable HttpMessageConverter found for response type
  10. react routers路由地址 F5刷新白屏