Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android數據庫框架——GreenDao輕量級的對象關系映射框架

Android數據庫框架——GreenDao輕量級的對象關系映射框架

編輯:關於Android編程

這裡寫圖片描述

 

但是對於我個人來說,我可能更加傾向於用GreenDao,所以今天也為大家帶來了GreenDao的詳細博客,希望大家喜歡,之前也詳細介紹了ORM的思想,如果不明白可以先看一下前面的博文,這裡就不多贅述了,我們新建一個工程

這裡寫圖片描述

一.相關介紹

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

傳說中的優點

最大性能(最快的 Android ORM) 易於使用API 高度優化 最小內存消耗

這裡寫圖片描述

那我們可以先來看看怎麼集成吧!<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjwvYmxvY2txdW90ZT4NCryvs8nOxLW1o7o8YSBocmVmPQ=="http://greenrobot.org/greendao/documentation/how-to-get-started/">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

    

我們只需要看他的點擊事件就可以了

  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 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吧

    

這樣,我們就可以直接看他的點擊事件了

         case R.id.btn_add_mult:
                List 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,我們去驗證一下,寫個按鈕咯?

     

直接看點擊事件

         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;
    }

這樣就寫個按鈕

    

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

    

這樣我們就可以去查詢了

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

十.全部查詢

全部查詢比較簡單

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

直接去調用就好了

case R.id.btn_load_all:
      List 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 list = daoManager.getDaoSession().queryRaw(Student.class, where,
                new String[]{"%l%", "6"});
        Log.i(TAG, list + "");
    }

    /**
     * QueryBuilder查詢大於
     */
    public void queryBuilder() {
        //查詢構建器
        QueryBuilder queryBuilder = daoManager.getDaoSession().queryBuilder(Student.class);
        //查詢年齡大於19的北京
        List 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 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 listAll() {
        return daoManager.getDaoSession().loadAll(Student.class);
    }

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

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

OK,這個博客算是結束了,我們下一篇再聊

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved