GreenDao框架入门及基础使用(Android studio 完整配置)

本文介绍GreenDao ORM框架的基础使用,包括环境配置、实体类编写、数据库工具类封装等内容,适用于Android项目的数据库操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GreenDao框架入门及基础使用(Android studio 完整配置)

一、初识GreenDao框架

GreenDao是一款ORM(object/relational mapping 对象关系映射)框架。是目前普片认为从实用性,高效性,方便性等各方面公认最好的一款轻量级ORM框架。
之前类似的框架(具有ORM模块功能)的又ormlite,xUtil等等类似框架。

GreenDao的官网:http://greenrobot.org/greendao/
GreenDao的下载地址:https://github.com/greenrobot/greenDAO

二、GreenDao在程序代码中做哪一个层面的东西。

首先,GreenDao是一个ORM框架,那么什么是ORM?
ORM是对象关系映射,那什么是对象(Object),什么是关系(Relational)?对象就是Java对象(不多解释,如果什么是java对象都不知道,就先去学习Java基础),关系就是数据库中的二维表,在数据库中的二维表也叫做关系。对象关系映射,就是java对象和数据库中的表进行一一对应,使用一个java对象去表示一个数据库的表。所以GreenDao就是一个将SQLite数据库和Java Object对象进行关联的框架。
那么就是说,GreenDao主要用在数据持久层,就是操作数据库(库,表,数据)的一系列(CRUD)增删改查的封装,它就是一款让我们能在代码中快速建表,查数据,更新删除数据,更新表等的工具。

三、GreenDao在项目中的完整使用配置。

本文章中完全基于gradle配置搭建,网上有些关于这方面的文章,写了要创建一个module,还要创建一个java module或是java 类来创建生成 greendao相关辅助类等,这样个人感觉有点太麻烦。

1.创建Demo Module。
我们将greendao相关代码放置在src\main目录下,即java源码同级目录,新建java-gen,如
这里写图片描述

此时java-gen只是一个目录,并非源码目录,区别于java蓝色文件夹图标,所以在gradle文件中的android 节点下加上如下代码,同步gradle文件即可

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

这里写图片描述

2.应用依赖库和插件。

  • 打开module的设置页面,搜索greendao如图添加依赖,对应红色方框的两个jar:
    这里写图片描述

  • 同时在gradle文件顶部,第一行下面加入以下开码:

apply plugin: 'org.greenrobot.greendao'

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
    }
}

greendao {
    schemaVersion 1
    daoPackage 'com.frosty.dao'
    targetGenDir 'src/main/java-gen'
}
说明:schemaVersion -->数据库版本,今后数据库升级用到;daoPackage --> green到自动生成的dao模型位置的包名。

至此,greendao完整配置已经完成!但此时你同步后发现java-gen目录下还是什么都没有 
原因是greendao会根据你整映程目录下的注有@Entity的类去实现orm映射,才去生成相关的辅助类。

四、编写你的实体类

我们在java-gen目录新建存放实体的包名,并创建一个Teacher实体
这里写图片描述

实体代码如下:


@Entity
public class Teacher {

    @Id(autoincrement = true)
    private Long id;
    @Property(nameInDb = "USERNAME")
    private String name;
    @NotNull 
    private int age;
    @Transient 
    private int flag;

    @Generated
    public Teacher() {
    }

    @Generated
    public Teacher(Long id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

五、Build Make,生成对应Dao

写好此实体类后,在gradle文件中确定好生成的dao目录,然后Sync
这里写图片描述

然后Build中Make一下即可生成对应的dao

这里写图片描述

我们点开DaoMaster或者DaoSession,你会发现这个注解
这里写图片描述

所以问题来了,那么不让我们修改这些个类,如何使用使用或者扩展他们?

六、 封装你的数据库工具类

在如图目录新建db目录,用于存放你的工具类,注意这里我们以后在实际应用中,需要新增实体时候,规则和Teacher一样,Make后会自动在dao目录下生成对应的xxDao,同时会自动更新Dao下的DaoMaster类。

我们创建DaoManager类,用于数据库相关实例的获取或维护,借助这个类创建或者管理数据库,关闭连接等操作,完整代码如下:


/**
 * Created by Frosty on 2017/6/7.
 */

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

    /*单例模式*/
    private DaoManager(){}
    private static class DaoManagerFactory{
        static DaoManager daoManager = new DaoManager();
    }
    public static DaoManager getInstance(Context context){
        if(mContext==null) mContext= context;
        return DaoManagerFactory.daoManager;
    }


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

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

    /**
     * 获取数据库
     * @return
     */
    public SQLiteDatabase getDatabase(){
        return db;
    }

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

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

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

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

}

同时我们创建DBUtils类,用于模型数据到数据库的操作对接,例如增、删、改、查等具体操作,以下代码仅提供样例,根据Teacher模型数据来操作。完整代码如下:


/** Created by Frosty on 2017/6/7.
 */
public class DBUtils {
    private DaoManager daoManager;
    private static Context mContext;
    /*单利*/
    private DBUtils(){
        daoManager = DaoManager.getInstance(mContext);
    }
    private static class DBUtilsFactory{
        static DBUtils dbUtils = new DBUtils();
    }
    public static DBUtils getInstance(Context context){
        if(mContext==null) mContext = context;
        return  DBUtilsFactory.dbUtils;
    }
    /**
     * 对数据库中Teacher表的插入操作
     * @param Teacher
     * @return
     */
    public boolean insertTeacher(Teacher Teacher) {
        boolean flag = false;
        flag = daoManager.getDaoSession().insert(Teacher) != -1 ? true : false;
        return flag;
    }

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

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

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

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

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

    /**
     * 原生查询
     */
    public void queryNative() {
        //查询条件
        String where = "where name like ? and _id > ?";
        //使用sql进行查询
        List<Teacher> list = daoManager.getDaoSession().queryRaw(Teacher.class, where,
                new String[]{"%l%", "6"});
    }elass);
        //查询年龄大于19的李四
        List<Teacher> list = queryBuilder.where(Teacher
Dao.Properties.Age.ge(19)).where(TeacherDao.Properties.Name.like("李四")).list();
    }
}

七、 使用工具类

很简单,获取DBUtil单例,直接调用对应方法即可,如图:
这里写图片描述

结束语:本文章copy代码的时候高亮代码看着可能有点紊乱,代码可以直接copy到你的类中,引入对于包即可,源码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值