技術共享之數據庫框架GreenDao的使用以及二次封裝

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 都會在數據庫中幫我們完成

    @Entity
public 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
如需轉載請標明出處,謝謝。。

發佈了27 篇原創文章 · 獲贊 12 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章