Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite

简介: Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite 前不久,我在写了ORMLite这个框架的博文 Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包 但是对于我个人来说,我可能更加倾向于用GreenDao,所以今天也为.

Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite

这里写图片描述

前不久,我在写了ORMLite这个框架的博文

  • Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包

但是对于我个人来说,我可能更加倾向于用GreenDao,所以今天也为大家带来了GreenDao的详细博客,希望大家喜欢,之前也详细介绍了ORM的思想,如果不明白可以先看一下前面的博文,这里就不多赘述了,我们新建一个工程

这里写图片描述

一.相关介绍

  • 官方网站 : http://greendao-orm.com/
  • Github : https://github.com/greenrobot/greenDAO

传说中的优点

  • 最大性能(最快的 Android ORM)
  • 易于使用API
  • 高度优化
  • 最小内存消耗

这里写图片描述

那我们可以先来看看怎么集成吧!

  • 集成文档:http://greenrobot.org/greendao/documentation/how-to-get-started/

首先,我们查看Github上的集成步骤,先添加依赖
我们要添加

 compile 'org.greenrobot:greendao:2.2.1'

同时也要添加java的项目包

 compile 'org.greenrobot:greendao-generator:2.2.0'

紧接着,我们在main目录下创建一个文件夹java-gen

然后继续在配置文件中添加

//仓库
sourceSets{
        main{
            java.srcDirs = ['src/main/java','src/main/java-gen']
        }
    }

最后,新建一个Module,选择JAVA Library,创建成功后,我们在他的build.gradle下添加

compile 'org.greenrobot:greendao-generator:2.2.0'

二.实体类

到这里,我们的初步集成算是完成了,是不是比较麻烦,我们看

这里写图片描述

她说现在去看java-gen有生成代码,实际上我们去看并没有,因为我们需要NoteDao.java,一个数据缓存对象,那我们需要怎么去做呢?我们直接在Module的类里写了

package com.example;

import de.greenrobot.daogenerator.DaoGenerator;
import de.greenrobot.daogenerator.Entity;
import de.greenrobot.daogenerator.Schema;

public class DaoMaker {
    public static void main(String[] args) {
        //生成数据库的实体类,还有版本号
        Schema schema = new Schema(1, "com.student.entity");
        addStudent(schema);
        //指定dao
        schema.setDefaultJavaPackageDao("com.student.dao");
        try {
            //指定路径
            new DaoGenerator().generateAll(schema, "D:\\github\\GreenDao\\app\\src\\main\\java-gen");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 创建数据库的表
     *
     * @param schema
     */
    public static void addStudent(Schema schema) {
        //创建数据库的表
        Entity entity = schema.addEntity("Student");
        //主键 是int类型
        entity.addIdProperty();
        //名称
        entity.addStringProperty("name");
        //年龄
        entity.addIntProperty("age");
        //地址
        entity.addStringProperty("address");
    }
}

写完这个时候我们要注意了,我们不能直接去运动这个工程,我们要单独编译这个java类。也就是右键

这里写图片描述

编译的时间有点点长,我们耐心等待一下就好了,这个时候我们可以看到控制台会打印相关的信息

这里写图片描述

这个时候你再去看java-gen目录,就会有东西了

这里写图片描述

很nice,这算是前期基本已经完工了,我们可以看他的原型图

这里写图片描述

三.核心类

可以看到,GreenDao是有自己创建的类的,我们来看看是什么类

  • DaoSession:会话层,操作具体dDao类,提供了基本的持久化操作方法,比如对实体对象的insert,load,update,refresh,delete的一些操作
  • XXDao:实际生成的Dao类,通常对应具体的java类,greenDao为每一个实体类创建一个Dao,他提供了比DaoSession更为具体的付费,比如count,loadALL和inserlnTx,批量插入
  • xxEntity:持久的实体对象,通常代表数据库row标准的java属性
  • Schema:实例数据schema,通过schema的版本和缺省的java包调用构造器

四.封装操作类

OK,了解的差不多了,我们就来实战操作一下吧!实战的时候,我们不需要在主Activity中放太多的逻辑代码,全部封装在一个数据库的操作类中其实是最好的,所以我们先新建一个类

package com.lgl.greendao;

import android.content.Context;

import com.student.dao.DaoMaster;
import com.student.dao.DaoSession;

import de.greenrobot.dao.query.QueryBuilder;

/**
 * 数据库操作类
 * Created by LGL on 2016/7/2.
 */
public class DaoManager {


    /**
     * 实现功能
     * 1.创建数据库
     * 2.创建数据库的表
     * 3.对数据库的升级
     * 4.对数据库的增删查改
     */

    //TAG
    public static final String TAG = DaoManager.class.getSimpleName();
    //数据库名称
    private static final String DB_NAME = "greendao.db";
    //多线程访问
    private volatile static DaoManager manager;
    //操作类
    private static DaoMaster.DevOpenHelper helper;
    //上下文
    private Context mContext;
    //核心类
    private static DaoMaster daoMaster;
    private DaoSession daoSession;

    //单例模式
    public static DaoManager getInstance() {
        DaoManager instance = null;
        if (manager == null) {
            synchronized (DaoManager.class) {
                if (instance == null) {
                    instance = new DaoManager();
                    manager = instance;
                }
            }
        }
        return instance;
    }

    //传递上下文
    public void  initManager(Context context){
        this.mContext = context;
    }

    /**
     * 判断是否存在数据库,如果没有则创建
     *
     * @return
     */
    public DaoMaster getDaoMaster() {
        if (daoMaster == null) {
            helper = new DaoMaster.DevOpenHelper(mContext, DB_NAME, null);
            daoMaster = new DaoMaster(helper.getWritableDatabase());
        }
        return daoMaster;
    }

    /**
     * 完成对数据库的操作,只是个接口
     *
     * @return
     */
    public DaoSession getDaoSession() {
        if (daoSession == null) {
            if (daoMaster == null) {
                daoMaster = getDaoMaster();
            }
            daoSession = daoMaster.newSession();
        }
        return daoSession;
    }

    /**
     * 打开输出日志,默认关闭
     */
    public void setDebug() {
        QueryBuilder.LOG_SQL = true;
        QueryBuilder.LOG_VALUES = true;
    }

    /**
     * 关闭DaoSession
     */
    public void closeDaoSession() {
        if (daoSession != null) {
            daoSession.clear();
            daoSession = null;
        }
    }

    /**
     * 关闭Helper
     */
    public void closeHelper() {
        if (helper != null) {
            helper.close();
            helper = null;
        }
    }

    /**
     * 关闭所有的操作
     */
    public void closeConnection() {
        closeHelper();
        closeDaoSession();
    }




}

这个类能初始化数据库的很多操作,不过这样还不够,我们需要再写个实在点的操作类,现在只是单单实现一个插入的动作

package com.lgl.greendao;

import android.content.Context;

import com.student.entity.Student;

/**
 * 完成对某一张表的具体操作
 * Created by LGL on 2016/7/2.
 */
public class CommonUtils {

    private DaoManager daoManager;

    //构造方法
    public CommonUtils(Context context) {
        daoManager = DaoManager.getInstance();
        daoManager.initManager(context);
    }

    /**
     * 对数据库中student表的插入操作
     * @param student
     * @return
     */
    public boolean insertStudent(Student student) {
        boolean flag = false;
        flag = daoManager.getDaoSession().insert(student) != -1 ? true : false;
        return flag;
    }
}

五.插入

OK,那我们先去看看sql的插入是怎么做的,定义一个button

    <Button
        android:id="@+id/btn_add"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="添加数据" />

我们只需要看他的点击事件就可以了

  case R.id.btn_add:
      dbUtils = new CommonUtils(this);
      Student student = new Student();
      student.setName("lgl");
      student.setAge(18);
      student.setAddress("北京");
      dbUtils.insertStudent(student);
    break;

我们一运行之后,就可以在data/data/报名/databases中找到数据库了

这里写图片描述

只要把他到处到桌面上,就可以查看数据了

这里写图片描述

这里感觉不好,ID应该设置自动增长的对吧!其实只要不设置ID,他就会自增长的

六.批量插入

插入可以了,我们批量插入就简单了,CommonUtils中增加与一个方法

  /**
     * 批量插入
     *
     * @param students
     * @return
     */
    public boolean inserMultStudent(final List<Student> students) {
        //标识
        boolean flag = false;
        try {
            //插入操作耗时
            daoManager.getDaoSession().runInTx(new Runnable() {
                @Override
                public void run() {
                    for (Student student : students) {
                        daoManager.getDaoSession().insertOrReplace(student);
                    }
                }
            });
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return flag;
    }

我们可以去验证一下吧,那首先先去写一个button吧

    <Button
        android:id="@+id/btn_add_mult"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="批量添加数据" />

这样,我们就可以直接看他的点击事件了

         case R.id.btn_add_mult:
                List<Student> list = new ArrayList<>();
                for (int i = 0; i < 10; i++) {
                    Student studentlist = new Student();
                    studentlist.setName("lgl" + i);
                    studentlist.setAge(18 + i);
                    studentlist.setAddress("北京" + i);
                    list.add(studentlist);
                }
                dbUtils.inserMultStudent(list);
                break;

我们现在把数据库导出来看看

这里写图片描述

OK,这个非常的nice

七.修改

增删查改嘛,增加说完了,我们来说修改,我们继续写修改的方法然后去验证,这样对于读者来说也是阅读性比较好的

     /**
     * 修改
     * @param student
     * @return
     */
    public boolean updateStudent(Student student){
        boolean flag = false;
        try{
            daoManager.getDaoSession().update(student);
            flag = true;
        }catch (Exception e){
            e.printStackTrace();
        }
        return  flag;
    }

OK,我们去验证一下,写个按钮咯?

     <Button
        android:id="@+id/btn_update"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="修改一条数据" />

直接看点击事件

         case R.id.btn_update:
                Student studentupdate = new Student();
                //根据ID来修改
                studentupdate.setId((long) 1);
                //把年龄改成100岁
                studentupdate.setAge(100);
                dbUtils.updateStudent(studentupdate);
                break;

很好,很强势,我们导出数据库,看看有没有修改成100岁

这里写图片描述

好,那我们可以看到,虽然被改成了100,但是其他字段为null,因为我们修改的时候没有设置,好吧,设置一下

这里写图片描述

现在我们可以看到修改了

八.删除

删除就比较简单了,我们直接写

/**
     * 删除
     *
     * @param student
     * @return
     */
    public boolean deleteStudent(Student student) {
        boolean flag = false;
        try {
            //删除指定ID
            daoManager.getDaoSession().delete(student);
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return flag;
    }

这样就写个按钮

    <Button
        android:id="@+id/btn_delete"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="删除一条数据" />

OK,点击事件是比较简单的

         case R.id.btn_delete:
                Student studentdelete = new Student();
                studentdelete.setId((long) 3);
                dbUtils.deleteStudent(studentdelete);
                break;

我们要删除的是他ID为3的数据,那我们运行

这里写图片描述

可以看到,ID为3的数据已经不见了

九.查询

OK,增删查改我们只剩下查询了,我们先来看一下怎么查询一条语句,写个方法

     /**
     * 查询单条
     *
     * @param key
     * @return
     */
    public Student listOneStudent(long key) {
        return daoManager.getDaoSession().load(Student.class, key);
    }

我们再定义一个button

    <Button
        android:id="@+id/btn_load"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="查询一条数据" />

这样我们就可以去查询了

case R.id.btn_load:
  Log.i(TAG, dbUtils.listOneStudent(5) + "");
 break;

十.全部查询

全部查询比较简单

    /**
     * 全部查询
     *
     * @return
     */
    public List<Student> listAll() {
        return daoManager.getDaoSession().loadAll(Student.class);
    }

直接去调用就好了

case R.id.btn_load_all:
      List<Student> lists = dbUtils.listAll();
      Log.i(TAG, lists.toString());
  break;

十一.QueryBuilder

作为最重要的查询,GreenDao肯定是为我们做了很多事情,我们可以翻阅API找到QueryBuilder,这个复合查询该怎么用呢?我们根据条件来进行逻辑查询,原生的有,ORMLite也有,GreenDao也有,我就拿原生的和GreenDao来做对比

  /**
     * 原生查询
     */
    public void queryNative() {
        //查询条件
        String where = "where name like ? and _id > ?";
        //使用sql进行查询
        List<Student> list = daoManager.getDaoSession().queryRaw(Student.class, where,
                new String[]{"%l%", "6"});
        Log.i(TAG, list + "");
    }

    /**
     * QueryBuilder查询大于
     */
    public void queryBuilder() {
        //查询构建器
        QueryBuilder<Student> queryBuilder = daoManager.getDaoSession().queryBuilder(Student.class);
        //查询年龄大于19的北京
        List<Student> list = queryBuilder.where(StudentDao.Properties.Age.ge(19)).where(StudentDao.Properties.Address.like("北京")).list();
        Log.i(TAG, list + "");
    }

不难看出,使用起来是比较方便的,我们可以无限的加where条件查询

十二.完结

增删查改已经基本上都讲完了,那基本上这个框架也OK了,我们来看一下他运行的截图

这里写图片描述

逻辑说的还算是比较详细的,但是这个CommonUtils比较零散

CommonUtils

package com.lgl.greendao;

import android.content.Context;
import android.util.Log;

import com.student.dao.StudentDao;
import com.student.entity.Student;

import java.util.List;

import de.greenrobot.dao.query.QueryBuilder;

/**
 * 完成对某一张表的具体操作
 * Created by LGL on 2016/7/2.
 */
public class CommonUtils {

    //TAG
    private static final String TAG = CommonUtils.class.getSimpleName();

    private DaoManager daoManager;

    //构造方法
    public CommonUtils(Context context) {
        daoManager = DaoManager.getInstance();
        daoManager.initManager(context);
    }

    /**
     * 对数据库中student表的插入操作
     *
     * @param student
     * @return
     */
    public boolean insertStudent(Student student) {
        boolean flag = false;
        flag = daoManager.getDaoSession().insert(student) != -1 ? true : false;
        return flag;
    }

    /**
     * 批量插入
     *
     * @param students
     * @return
     */
    public boolean inserMultStudent(final List<Student> students) {
        //标识
        boolean flag = false;
        try {
            //插入操作耗时
            daoManager.getDaoSession().runInTx(new Runnable() {
                @Override
                public void run() {
                    for (Student student : students) {
                        daoManager.getDaoSession().insertOrReplace(student);
                    }
                }
            });
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return flag;
    }

    /**
     * 修改
     *
     * @param student
     * @return
     */
    public boolean updateStudent(Student student) {
        boolean flag = false;
        try {
            daoManager.getDaoSession().update(student);
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return flag;
    }

    /**
     * 删除
     *
     * @param student
     * @return
     */
    public boolean deleteStudent(Student student) {
        boolean flag = false;
        try {
            //删除指定ID
            daoManager.getDaoSession().delete(student);
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        //daoManager.getDaoSession().deleteAll(); //删除所有记录
        return flag;
    }

    /**
     * 查询单条
     *
     * @param key
     * @return
     */
    public Student listOneStudent(long key) {
        return daoManager.getDaoSession().load(Student.class, key);
    }

    /**
     * 全部查询
     *
     * @return
     */
    public List<Student> listAll() {
        return daoManager.getDaoSession().loadAll(Student.class);
    }

    /**
     * 原生查询
     */
    public void queryNative() {
        //查询条件
        String where = "where name like ? and _id > ?";
        //使用sql进行查询
        List<Student> list = daoManager.getDaoSession().queryRaw(Student.class, where,
                new String[]{"%l%", "6"});
        Log.i(TAG, list + "");
    }

    /**
     * QueryBuilder查询大于
     */
    public void queryBuilder() {
        //查询构建器
        QueryBuilder<Student> queryBuilder = daoManager.getDaoSession().queryBuilder(Student.class);
        //查询年龄大于19的北京
        List<Student> list = queryBuilder.where(StudentDao.Properties.Age.ge(19)).where(StudentDao.Properties.Address.like("北京")).list();
        Log.i(TAG, list + "");
    }
}
原文地址http://www.bieryun.com/2828.html


相关文章
|
2月前
|
SQL 关系型数据库 数据库连接
php连接数据库之PDO,PDO的简单使用和预定义占位符的使用以及PDOStatement对象的使用,占位符的不同形式,bindValue和bindParam绑定预定义占位符参数的区别
本文介绍了PHP中PDO(PHP Data Objects)扩展的基本概念和使用方法。内容包括PDO类和PDOStatement类的介绍,PDO的简单使用,预定义占位符的使用方法,以及PDOStatement对象的使用。文章还讨论了绑定预定义占位符参数的不同形式,即bindValue和bindParam的区别。通过具体示例,展示了如何使用PDO进行数据库连接、数据查询、数据插入等操作。
php连接数据库之PDO,PDO的简单使用和预定义占位符的使用以及PDOStatement对象的使用,占位符的不同形式,bindValue和bindParam绑定预定义占位符参数的区别
|
2月前
|
安全 API 开发工具
Android平台RTMP推送|轻量级RTSP服务如何实现麦克风|扬声器声音采集切换
Android平台扬声器播放声音的采集,在无纸化同屏等场景下,意义很大,早期低版本的Android设备,是没法直接采集扬声器audio的(从Android 10开始支持),所以,如果需要采集扬声器audio,需要先做系统版本判断,添加相应的权限。
|
2月前
|
编解码 开发工具 Android开发
Android平台实现屏幕录制(屏幕投影)|音频播放采集|麦克风采集并推送RTMP或轻量级RTSP服务
Android平台屏幕采集、音频播放声音采集、麦克风采集编码打包推送到RTMP和轻量级RTSP服务的相关技术实现,做成高稳定低延迟的同屏系统,还需要有配套好的RTMP、RTSP直播播放器
|
3月前
|
SQL Java 数据库连接
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。
Hibernate 是一款开源 ORM(对象关系映射)框架,封装了 JDBC,允许以面向对象的方式操作数据库,简化了数据访问层的开发。通过映射机制,它可以自动处理对象与数据库表之间的转换,支持主流数据库,提高了代码的可移植性和可维护性。其核心接口包括 SessionFactory、Session 和 Transaction 等,通过它们可以执行数据库的 CRUD 操作。配置方面,需在项目中引入 Hibernate 及数据库驱动依赖,并创建 `hibernate.cfg.xml` 配置文件来设置数据库连接和 Hibernate 行为参数。
47 1
|
3月前
|
数据库连接 数据库
实现加载驱动、得到数据库对象、关闭资源的代码复用,将代码提取到相应的工具包里边。优化程序
该博客文章展示了如何通过创建工具类`Connectiontools`实现数据库连接、语句执行以及资源关闭的代码复用,以优化程序并提高数据库操作的效率和安全性。
|
3月前
|
开发者 算法 虚拟化
惊爆!Uno Platform 调试与性能分析终极攻略,从工具运用到代码优化,带你攻克开发难题成就完美应用
【8月更文挑战第31天】在 Uno Platform 中,调试可通过 Visual Studio 设置断点和逐步执行代码实现,同时浏览器开发者工具有助于 Web 版本调试。性能分析则利用 Visual Studio 的性能分析器检查 CPU 和内存使用情况,还可通过记录时间戳进行简单分析。优化性能涉及代码逻辑优化、资源管理和用户界面简化,综合利用平台提供的工具和技术,确保应用高效稳定运行。
84 0
|
3月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
全面解析TensorFlow Lite:从模型转换到Android应用集成,教你如何在移动设备上轻松部署轻量级机器学习模型,实现高效本地推理
【8月更文挑战第31天】本文通过技术综述介绍了如何使用TensorFlow Lite将机器学习模型部署至移动设备。从创建、训练模型开始,详细演示了模型向TensorFlow Lite格式的转换过程,并指导如何在Android应用中集成该模型以实现预测功能,突显了TensorFlow Lite在资源受限环境中的优势及灵活性。
268 0
|
3月前
|
SQL 关系型数据库 数据库
手把手教你管理PostgreSQL数据库及其对象
手把手教你管理PostgreSQL数据库及其对象
70 0
|
3月前
|
druid Java 数据库连接
SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池,以及实现增删改查功能
SpringBoot项目整合MybatisPlus和Druid数据库连接池,实现基本的增删改查功能。
356 0
下一篇
无影云桌面