技术共享之数据库框架GreenDao的使用以及二次封装

来源:互联网 发布:安卓手机视频录像软件 编辑:程序博客网 时间:2024/05/19 23:27
greendao 框架是一款ORM 数据库框架,ORM也就是对象关系映射。 相比其他数据库框架与原生的sql语句相比         好处:1、一个精简的库              2、性能最大化              3、内存开销最小化              4、易于使用的 APIs              5、对 Android 进行高度优化

这里写图片描述

DaoSession :会话层。操作具体的Dao 对象。提供了基本的持久化方法,比如对实体对 象的insert 、load、update、refresh、还有delete 等等。
XXDao :实际生成的Dao类 通常对应具体的Java类,greendao 为每 一个实体创建一个Dao,她提供DaoSession更具体的方法,比如count ,loadAll, 和insertInTx(支持批量插入)

步入正题

第一步 ,开始配置 greendao
1. 在工程(project.gradle)的gradle 中 添加 classpath
这里写图片描述

buildscript {    repositories {        google()        jcenter()    }    dependencies {        classpath 'com.android.tools.build:gradle:3.0.1'        classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'          // NOTE: Do not place your application dependencies here; they belong        // in the individual module build.gradle files    }}
  1. 在app.gradle 中添加
    这里写图片描述
    这里写图片描述
apply plugin: 'org.greenrobot.greendao'
 greendao {        schemaVersion 1   //schema版本        daoPackage 'com.liang.boke.GreenDao.gen'  //包名        targetGenDir 'src/main/java'   //目录文件夹    }
 compile'org.greenrobot:greendao:3.0.1' compile'org.greenrobot:greendao-generator:3.0.0'

第二步、写实体类
新建实体类,里面包括要数据库表中的键 ,这些greendao 都会在数据库中帮我们完成

    @Entitypublic class UserInfo {    @Id(autoincrement = true)    private  Long _id ;    private  String name ;    private  String age ;    private  String address ;  }

写完实体类之后 ctrl + F9 (rebuilder) 这时 greendao 会自动在实体类中帮我们生成 get 和 set 方法
这里写图片描述
也会在对应的 你自己在 app.gradle 中配置的 greendao{ } 中 对应的包中 生成对应的DaoMaster DaoSession XXXDao
这里写图片描述

以上就完成了对greendao 的基本配置

接下来要做的就是 对 greendao 进行二次封装

第三步 新建一个类 DaoManager.java
此类用来对数据库的创建 创建表 ,更新数据库

package com.liang.boke.GreenDao.gen.DaoManager;import android.content.Context;import com.liang.boke.GreenDao.gen.DaoMaster;import com.liang.boke.GreenDao.gen.DaoSession;import com.liang.boke.GreenDao.gen.UserInfo;import org.greenrobot.greendao.query.QueryBuilder;/** * Created by 梁 on 2017/12/7. */public class DaoManager {    private  static  final  String DB_NAME = "Greendao.sqlite";    private  static  final  String TAG = DaoManager.class.getSimpleName();    private static volatile DaoManager daoManager ;  //多线程 使用单例模式    private  static DaoMaster daoMaster ;    private  static DaoSession daoSession ;    private  static  DaoMaster.DevOpenHelper helper ;    private Context context ;    /*    * 使用单例模式 保证数据库的安全    * */    public  static  DaoManager getInstance(){        DaoManager instance = null ;        if(daoManager == null)        {            synchronized (UserInfo.class)            {                if(instance == null)                {                    instance = new DaoManager();                }                daoManager = instance ;            }        }        return daoManager ;    }    /*    * 初始化daomanager    * */    public  void  init(Context context){        this.context = context ;    }    /**     * 判断是否存在数据库,如果没有则创建数据库     * @return     */    public DaoMaster getDaoMaster(){        if(daoMaster == null)        {            helper = new DaoMaster.DevOpenHelper(context,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(Boolean isDebug){        if(isDebug)        {            QueryBuilder.LOG_SQL =true ;            QueryBuilder.LOG_VALUES = true ;        }        else        {            QueryBuilder.LOG_SQL =true ;            QueryBuilder.LOG_VALUES = true ;        }    }    /*    * 关闭 help    * */    public  void closeHelper(){        if(helper != null)        {            helper.close();            helper = null ;        }    }    /*    * 关闭 会话    * */    public  void closeSession(){        if(daoSession != null)        {            daoSession.clear();            daoSession = null ;        }    }    /*    *   关闭所有的操作 数据库用完的时候必须关闭 节省资源     */    public  void closeConnection(){        closeHelper();        closeSession();    }}

第四步、 新建一个DbUtil 类 用来对 数据库的增删改查方法进行封装

package com.liang.boke.GreenDao.gen.Common;import android.content.Context;import android.content.Entity;import com.liang.boke.GreenDao.gen.DaoManager.DaoManager;import com.liang.boke.GreenDao.gen.DaoSession;import com.liang.boke.GreenDao.gen.UserInfo;import com.liang.boke.GreenDao.gen.UserInfoDao;import org.greenrobot.greendao.query.QueryBuilder;import java.util.List;/** * Created by 梁 on 2017/12/7. */public class DbUtil {    private DaoManager daoManager ;    /*    * 构造方法 初始化daoManager    * */    public DbUtil(Context  context) {        daoManager =DaoManager.getInstance();        daoManager.init(context);    }    /*    * 插入一条数据对象    * */    public Boolean insertUser(UserInfo userInfo){        boolean flag  = false ;        try{            daoManager.getDaoSession().insert(userInfo);            flag = true ;        }catch (Exception e)        {            e.getStackTrace();        }        return flag ;    }    /*    * 插入多条数据对象    * 可能会存在耗时 操作 所以new 一个线程    * */    public Boolean insertMultUser(final List<UserInfo> userInfos){        boolean flag  = false ;        try{            daoManager.getDaoSession().runInTx(new Runnable() {                @Override                public void run() {                    for (UserInfo userInfo :userInfos)                    {                        daoManager.getDaoSession().insert(userInfo);                    }                }            });            flag = true ;        }catch (Exception e)        {            e.getStackTrace();        }        return flag ;    }    /*    * 修改一条数据    * 根据id 修改    * */    public  boolean upDateUser(UserInfo userInfo){        boolean flag = false ;        try{            daoManager.getDaoSession().update(userInfo);            flag = true ;        }catch (Exception e)        {            e.getStackTrace();        }        return flag ;    }    /*    * 删除一条数据    * 根据_id 删除    * */    public  boolean deleteUser(UserInfo userInfo){        boolean flag = false ;        try{            daoManager.getDaoSession().delete(userInfo);            flag = true ;        }catch (Exception e)        {            e.getStackTrace();        }        return flag ;    }    /*    * 查询数据    *    * *////////返回多条数据    public List<UserInfo>  listAll(){        return daoManager.getDaoSession().loadAll(UserInfo.class);    }    ///////返回单条数据    /**     * 根据id 返回userinfo 对象     * @param key  id     * @return     */    public UserInfo  listAll(long key){        return daoManager.getDaoSession().load(UserInfo.class,key);    }    ///////////////强大的querybuilder//////////////    /*    * 可以自己封装 查询条件    * 返回 userinfo 对象集合    * */    public List<UserInfo> query(){        QueryBuilder<UserInfo> builder = daoManager.getDaoSession().queryBuilder(UserInfo.class);        List<UserInfo> lists = builder.where(UserInfoDao.Properties._id.ge(001))//                .where()          //where 使用的 逻辑与  相当于 数据库中的 and//                .where()//                .whereOr()         //.whereOr()  使用的 逻辑 或  相当于 数据库中的 or                .list();        return lists ;    }}

最后就是如何使用这些已经封装好的数据库util 了
布局activity_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"    tools:context="com.liang.boke.GreenDao.MainActivity">    <android.support.v7.widget.AppCompatButton        android:layout_marginTop="10dp"        android:id="@+id/btn_insertOne"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="插入一条数据"        />    <android.support.v7.widget.AppCompatButton        android:layout_marginTop="10dp"        android:id="@+id/btn_insertMulti"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="插入多条数据"        />    <android.support.v7.widget.AppCompatButton        android:layout_marginTop="10dp"        android:id="@+id/btn_update"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="更新一条数据"        />    <android.support.v7.widget.AppCompatButton        android:layout_marginTop="10dp"        android:id="@+id/btn_query"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="查询"        /></LinearLayout>

在MainActivity 中实现方法

package com.liang.boke.GreenDao;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.support.v7.widget.AppCompatButton;import android.view.View;import com.liang.boke.GreenDao.gen.Common.DbUtil;import com.liang.boke.GreenDao.gen.UserInfo;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity {    private AppCompatButton mInsertOne;    private AppCompatButton mInsertMulti;    private AppCompatButton mUpdate;    private AppCompatButton mQuery;    private AppCompatButton mDelete;    private DbUtil dbUtil;    private List<UserInfo> userInfos;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initUI();        initListener();    }    private void initUI() {        mInsertOne = (AppCompatButton) findViewById(R.id.btn_insertOne);        mInsertMulti = (AppCompatButton) findViewById(R.id.btn_insertMulti);        mUpdate = (AppCompatButton) findViewById(R.id.btn_update);        mDelete = (AppCompatButton) findViewById(R.id.btn_delete);        mQuery = (AppCompatButton) findViewById(R.id.btn_query);        dbUtil = new DbUtil(this);        userInfos = new ArrayList<>();    }    private void initListener() {        mInsertOne.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                UserInfo userInfo = new UserInfo();                userInfo.set_id((long) 001);                userInfo.setName("张三");                userInfo.setAge("20");                userInfo.setAddress("淮北市");            dbUtil.insertUser(userInfo);            }        });        mInsertMulti.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                for (int i = 1 ; i <= 10 ; i ++)                {                    UserInfo userInfo = new UserInfo();                    userInfo.set_id((long)001+i);                    userInfo.setName("李四"+ i);                    userInfo.setAge("20" + i);                    userInfo.setAddress("淮北" + i);                    userInfos.add(userInfo) ;                }                dbUtil.insertMultUser(userInfos);            }        });        mUpdate.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                UserInfo userInfo = new UserInfo() ;                //更改数据  以 _id                userInfo.set_id((long) 001);                userInfo.setName("更新");                userInfo.setAge("100");                userInfo.setAddress("香港");               dbUtil.upDateUser(userInfo) ;            }        });        mDelete.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                UserInfo userInfo = new UserInfo() ;                userInfo.set_id((long) 002);                dbUtil.deleteUser(userInfo);            }        });    }}

插入一条数据
这里写图片描述

插入多条数据

这里写图片描述

更新第一条数据
这里写图片描述

删除第二条数据

这里写图片描述

查询 _id 大于 001 的集合对象 数量
这里写图片描述

以上是对greendao 数据库框架的基本使用 有不足的欢迎提出来,源码已经上传到 http://download.csdn.net/download/baidu_38477614/10149691
有问题可以直接留言,也可以+Q 1915528523
如需转载请标明出处,谢谢。。

阅读全文
1 0
原创粉丝点击