内容介绍:GreenDAO框架的介绍和使用
最新更新时间:2016/7/5 12:00
官网:http://greenrobot.org/greendao/
版本:V2.2.1 Bug fix release (2016-05-24)
说明:主要内容均翻译自官网最新的开发文档
博客地址:http://blog.csdn.net/kevindgk/article/details/51833707
GitHub地址:https://github.com/KevinDGK/GreenDAODemo
版权声明:本文为原创文章,未经允许不得转载

简介

GreenDAO是一个开放的安卓代码库,来提供一个容易使用的SQLite数据库接口,帮助开发者更加高效的处理数据——将开发者从处理低级的数据库需求中解放出来,从而节省了开发时间。SQLite是一个很不错的嵌入式关系型数据库。不过,编写SPL和解析查询结果是相当的繁琐和耗时的任务。greenDAO通过使用ORM的方式,将开发人员解放出来。你可以使用一个简单的面向对象的API来完成数据的存储、更新、删除和查询操作(CRUD)。

安卓组内分享流程(Android ORM框架认知)

前言

我个人感觉,从简单的使用角度来讲,GreenDAO要比OrmLite、SugarORM等稍微复杂一些,尤其是2.x版本,前期配置代码分离的代码生成模块要稍微麻烦。但是,考虑到它的性能和非常强大的特点,我觉得这点儿麻烦不算什么。而且,3.x版本使用了注解,会使得代码生成十分方便,不用分离项目。截止到目前,3.0处于beta版本,后期会持续更新。
但是,一般来讲,Android端不会创建十分复杂的数据库,所以如果是简单的表结构和少量的数据,也可以采用其他的方法。同样是搬砖,但是也要学会灵活运用!

特点

  • 对象关系映射(ORM)
    greenDAO本质是提供一个面向对象的接口,完成对象与保存在关系数据库中的数据的映射。就像数据模型中定义的一样,greenDAO会创建数据的Java实体类(JavaBean),以及DAO类。这些会节省你很多无聊的代码,仅仅是数据的来回移动。另外,greenDAO会提供一些高级的ORM特点,例如会话缓存,预先加载,以及活跃的实体类(?)。
  • 最优的性能
    在已知的ORM框架中,是最快的。关于性能greenDAO不做任何妥协。数据库用于存储大量的数据,因此速度很重要。使用greenDAO,每秒可以插入、更新和加载几千个实体类。
  • APIs简单:强大的API包含了关系和连接;
  • 内存消耗少
  • 库文件小(<100KB);
  • 支持数据库加密:支持使用SQLCipher(SQLite数据库加密框架)对数据库加密;(友情提醒,该加密技术会使得apk变得很大)
  • 强大的开发团体

开发工具和开发环境

开发工具 Android Studio 2.1.2
数据库查看的工具 SQLite Expert Professional 3.1.9.2085

 How to get started

这个教程会帮助你完成一个简单的greenDAO例程。它可以在https://github.com/greenrobot/greenDAO获得,这个项目包含两个子项目:DaoExample和DaoExampleGenerator,可以clone下来进行学习。如果你将DaoExample从git仓库中复制出来,可以作为一个Android项目单独运行。如你所见,这是一个简单的记笔记的APP。你可以通过写入一些文本来添加新的笔记,并且通过点击删除按钮删除笔记。

Add greenDAO to your project

  1. 在src/main目录下创建一个目录(右键New->Directory),比如名称为java-dao-gen,该目录主要是用于存放生成的Bean、DAOs类。

  2. Android工程添加greenDAO依赖,并且给android节点添加程序来源:
    compile ‘org.greenrobot:greendao:2.2.0’
    sourceSets {
    main {
    java.srcDirs = [‘src/main/java’, ‘src/main/java-dao-gen’]
    }
    }
    如下图:

  3. 创建GreenDAO代码生成模块(Module),这是一个纯Java工程

    选择JAVA Library

    包名和类名随意定义,比如:
    包名:greendaogenerator
    类名:DAOGenerator

  4. 代码生成模块添加依赖
    compile ‘org.greenrobot:greendao-generator:2.2.0’

  5. 编写代码生成类DAOGenerator
    注意,Java工程只有这一个类,这个类就是用来生成代码模板的,在这个类中可以创建数据库,以及通过对象、关系等创建表结构,详细代码可以参考代码中的注释。

  6. 在DAOGenerator的main方法中点击鼠标右键,运行该方法,然后就会在我们的android工程中生成相应的Bean和DAOs类:

  7. 在Android工程中进行数据库的CRUD操作
    (详细见代码)
    /* 插入数据 /
    private void submit() {

    String name = et_name.getText().toString().trim();String stuId = et_id.getText().toString().trim();String phone = et_phone.getText().toString().trim();Student student = new Student(null, name, stuId, phone, new Date());/*    数据库里的一条记录对应着一个Java对象,所以插入操作,仅仅需要插入一个对象即可。 */DBUtil.getStudentDao().insert(student);Log.d("【submit】", "Inserted new student, ID: " + student.getId() + " , Name:"+name);

    }

    /* 查询所有数据 /
    private void queryAll() {

    /*    获取属性名称,这一步主要是为了查询的时候作为查询条件使用    String number = StudentDao.Properties.Number.columnName;    String orderBy = number + " COLLATE LOCALIZED ASC"; // 按照学号的升序排列    该方法是调用数据库SQLiteDatabase的query()方法来进行查询的,比较繁琐,但是说明也是执行SQL语句的    cursor = DBUtil.getDB().query(tablename, DBUtil.getStudentDao().getAllColumns(), null, null, null, null, orderBy);    String[] from = { name , number };    int[] to = { android.R.id.text1, android.R.id.text2 };    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cursor, from, to);    lv.setAdapter(adapter); */// 以下是通过GreenDAO的方式查询数据库,所有的操作都是面向对象的方式Query<Student> query = DBUtil.getStudentDao().queryBuilder()                        .where(StudentDao.Properties.Number.isNotNull())                        .orderAsc(StudentDao.Properties.Number)     // 按照学号的升序排列                        .build();list = query.list();if ((list != null) && (list.size()>0)) {    if (adapter == null) {        adapter = new MyLVAdapter();        lv.setAdapter(adapter);    } else {        adapter.notifyDataSetChanged();    }} else {    Toast.makeText(MainActivity.this,"数据库里没有数据了!",Toast.LENGTH_SHORT).show();}

    }

    /* 查询一条数据 /
    private void queryOne() {

    String stuId = et_stuid.getText().toString().trim();Log.i("【查询的学生的学号】",stuId);StudentDao studentDao = DBUtil.getStudentDao();// 一个可以被反复执行的查询的实体类Query<Student> query = studentDao.queryBuilder()                        .where(StudentDao.Properties.Number.eq(stuId))  // 学号属性等于被查询的数值                        .build();QueryBuilder.LOG_SQL = true;QueryBuilder.LOG_VALUES = true;// 查询结果以list返回List<Student> list = query.list();String result = "";if ((list != null) && (list.size()>0)) {    Student student = list.get(0);    result = student.getId()+","+student.getName()+","+student.getNumber()+","+student.getPhone()+","+new SimpleDateFormat().format(student.getDate());} else {    Toast.makeText(MainActivity.this,"查无此人!",Toast.LENGTH_SHORT).show();}tv_check_one.setText(result);

    }

    /* 删除一条数据 /
    private void deleteOne() {

    String stuId = et_stuid.getText().toString().trim();Log.i("【删除的学生的学号】",stuId);StudentDao studentDao = DBUtil.getStudentDao();// 一个可以被反复执行的查询的实体类Query<Student> query = studentDao.queryBuilder()        .where(StudentDao.Properties.Number.eq(stuId))  // 学号属性等于被查询的数值        .build();List<Student> list = query.list();for (int i = 0; i < list.size(); i++) {    studentDao.deleteByKey(list.get(i).getId());    //通过id删除掉记录}

    }

    /* 删除数据库所有数据 /
    private void deleteAll() {

    Log.i("【删除数据库所有数据】"," ======== 清空了~~~ ========= ");DBUtil.getStudentDao().deleteAll();list.clear();if (adapter != null) {    adapter.notifyDataSetChanged();}

    }

  8. 运行效果

预生成代码和创建表

  1. 所有的预生成代码都是由分离的Java模块生成的,在3.x中将会有较大的改善;
  2. 所有的对数据库的操作都是在Android项目中的,详细看demo中的MainActivity.java.

介绍


greenDAO是一个安卓的ORM工具,它提供了一个类面向对象的接口,将Object映射到关系数据库中。ORM工具如greenDAO做很多重复性的工作为你和为你提供一个简单的接口数据。

代码生成工程


为了在你的Android项目使用greenDAO(通常是一个Eclipse项目),您需要创建一个项目,generator项目。它的任务就是为你的安卓项目生成特定的代码。

核心类

问题

1.关于数据库创建的位置

一般情况下,为了安全,数据库创建在/data/data/包名/databases目录下即可,但是demo中为了随时将数据库从手机中取出,查看数据库的数据,所以暂时将数据库建立在sd卡中。
详细代码,见 DBUtil.java

2.简单封装,便于使用

在代码中为了使得使用更加清晰和方便,我简单的封装了一下,将DAOs都封装到了DBUtil.java里面了。

3.数据库的初始化

关于数据库的初始化,官方建议在Application层完成,这样的话,就不用多次创建Session了,但是,如果应用中对数据库的操作较少,只要确保在第一次执行数据库操作之前完成初始化即可。

更多相关文章

  1. Android(安卓)从 JNI 中传入 UTF8 的字符到 Java
  2. java &android base64加密解密
  3. Android避免进入一页面后EditText自动弹出软键盘
  4. Android(安卓)使用 Batterystats 和 Battery Historian 分析电池
  5. Android控制双击返回按钮退出程序的代码
  6. 【Android】MVVM架构 RecyclerView加载数据滑动到后面,数据错乱,点
  7. Android:开机自启动并接收推送消息
  8. Android(安卓)self_adaption of screen
  9. 使用Android(安卓)Camera2 API获取YUV数据

随机推荐

  1. Android:Service之远程服务和AIDL的创建
  2. Android技术归档
  3. Android下进行单元测试
  4. Android 保存 JNI 层 opencv cvMat 图片
  5. XML中的命名空间问题
  6. Android内核编译
  7. Android图形系统分析与移植 -- 四、Surfa
  8. Android:shape的使用详解(2)
  9. Android AES加密算法,现在实际上
  10. android 触屏反馈原理