Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> GreenDao的實用封裝

GreenDao的實用封裝

編輯:關於Android編程

前面簡單介紹了下GreenDao的使用,從前面的介紹看來是不是覺得有點 so easy。對就是這麼簡單。曾經有位大神說作為一位合格的程序員就要在學習別人的東西時,有點自己的想法。為了表示我是位比較合格的程序員,今天和大家介紹下GreenDao的比較實用的封裝。如果您還沒來得及學習greenDao的實用詳解,請前往GreenDao的使用詳解學習。長話短說我們正式開始介紹。首先我們新建兩個表,分別是Customer和Student表。其生成的文件如下所示。

\

(一)封裝下DaoMaster,DaoSession,DevOpenHelper對象

 

其具體代碼如DaoManager.java所示。

 

package com.jamy.DaoUtils;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;

import com.jamy.dao.DaoMaster;
import com.jamy.dao.DaoSession;

import de.greenrobot.dao.query.QueryBuilder;

/**
 * Created by jamy on 2016/6/16.
 * 進行數據庫的管理
 * 1.創建數據庫
 * 2.創建數據庫表
 * 3.對數據庫進行增刪查改
 * 4.對數據庫進行升級
 */
public class DaoManager {
    private static  final String   TAG = DaoManager.class.getSimpleName();
    private static  final String  DB_NAME="jamy.db";//數據庫名稱
    private volatile  static DaoManager mDaoManager;//多線程訪問
    private  static DaoMaster.DevOpenHelper mHelper;
    private static  DaoMaster mDaoMaster;
    private static DaoSession mDaoSession;
    private static SQLiteDatabase db;
    private Context context;

    /**
     * 使用單例模式獲得操作數據庫的對象
     * @return
     */
    public  static DaoManager getInstance(){
        DaoManager instance = null;
        if (mDaoManager==null){
            synchronized (DaoManager.class){
                if (instance==null){
                    instance = new DaoManager();
                    mDaoManager = instance;
                }
            }
        }
        return mDaoManager;
    }

    /**
     * 初始化Context對象
     * @param context
     */
    public void init(Context context){
        this.context = context;
    }

    /**
     * 判斷數據庫是否存在,如果不存在則創建
     * @return
     */
    public DaoMaster getDaoMaster(){
        if (null == mDaoMaster){
            mHelper =  new DaoMaster.DevOpenHelper(context,DB_NAME,null);
            mDaoMaster = new DaoMaster(mHelper.getWritableDatabase());
        }
        return mDaoMaster;
    }

    /**
     * 完成對數據庫的增刪查找
     * @return
     */
    public DaoSession getDaoSession(){
        if (null == mDaoSession){
            if (null == mDaoMaster){
                mDaoMaster = getDaoMaster();
            }
            mDaoSession = mDaoMaster.newSession();
        }
        return mDaoSession;
    }

    /**
     * 設置debug模式開啟或關閉,默認關閉
     * @param flag
     */
    public void setDebug(boolean flag){
        QueryBuilder.LOG_SQL = flag;
        QueryBuilder.LOG_VALUES = flag;
    }

    /**
     * 關閉數據庫
     */
    public void closeDataBase(){
        closeHelper();
        closeDaoSession();
    }

    public void closeDaoSession(){
        if (null != mDaoSession){
            mDaoSession.clear();
            mDaoSession = null;
        }
    }

    public  void  closeHelper(){
        if (mHelper!=null){
            mHelper.close();
            mHelper = null;
        }
    }

}
DaoManager主要是通過單列模式獲取對應的對象,以及對所有的對象進行初始化。

 

 

(二)封裝一可操作不同數據表的公共基類

其集體代碼BaseDao.java所示。

 

package com.jamy.DaoUtils;

import android.content.Context;
import android.util.Log;
import com.jamy.dao.CustomerDao;
import com.jamy.dao.DaoSession;
import java.util.List;
import de.greenrobot.dao.query.QueryBuilder;


/**
 * 將所有創建的表格相同的部分封裝到這個BaseDao中
 * Created by jamy on 16/6/16.
 */
public class BaseDao{
    public static final String TAG = BaseDao.class.getSimpleName();
    public static final boolean DUBUG = true;
    public DaoManager manager;
    public DaoSession daoSession;

    public BaseDao(Context context) {
        manager = DaoManager.getInstance();
        manager.init(context);
        daoSession = manager.getDaoSession();
        manager.setDebug(DUBUG);
    }

    /**************************數據庫插入操作***********************/
    /**
     * 插入單個對象
     * @param object
     * @return
     */
    public boolean insertObject(T object){
        boolean flag = false;
        try {
            flag = manager.getDaoSession().insert(object) != -1 ? true:false;
        } catch (Exception e) {
            Log.e(TAG, e.toString());
        }
        return flag;
    }

    /**
     * 插入多個對象,並開啟新的線程
     * @param objects
     * @return
     */
    public boolean insertMultObject(final List objects){
        boolean flag = false;
        if (null == objects || objects.isEmpty()){
            return false;
        }
        try {
            manager.getDaoSession().runInTx(new Runnable() {
                @Override
                public void run() {
                    for (T object : objects) {
                        manager.getDaoSession().insertOrReplace(object);
                    }
                }
            });
            flag = true;
        } catch (Exception e) {
            Log.e(TAG, e.toString());
            flag = false;
        }finally {
//            manager.CloseDataBase();
        }
        return flag;
    }

    /**************************數據庫更新操作***********************/
    /**
     * 以對象形式進行數據修改
     * 其中必須要知道對象的主鍵ID
     * @param object
     * @return
     */
    public void  updateObject(T object){

        if (null == object){
            return ;
        }
        try {
            manager.getDaoSession().update(object);
        } catch (Exception e) {
            Log.e(TAG, e.toString());
        }
    }

    /**
     * 批量更新數據
     * @param objects
     * @return
     */
    public void updateMultObject(final List objects, Class clss){
        if (null == objects || objects.isEmpty()){
            return;
        }
        try {

            daoSession.getDao(clss).updateInTx(new Runnable() {
                @Override
                public void run() {
                    for(T object:objects){
                        daoSession.update(object);
                    }
                }
            });
        } catch (Exception e) {
            Log.e(TAG, e.toString());
        }
    }


    /**************************數據庫刪除操作***********************/
    /**
     * 刪除某個數據庫表
     * @param clss
     * @return
     */
    public boolean deleteAll(Class clss){
        boolean flag = false;
        try {
            manager.getDaoSession().deleteAll(clss);
            flag = true;
        } catch (Exception e) {
            Log.e(TAG, e.toString());
            flag = false;
        }
        return flag;
    }

    /**
     * 刪除某個對象
     * @param object
     * @return
     */
    public void deleteObject(T object){
        try {
            daoSession.delete(object);
        } catch (Exception e) {
            Log.e(TAG, e.toString());
        }
    }

    /**
     * 異步批量刪除數據
     * @param objects
     * @return
     */
    public boolean deleteMultObject(final List objects, Class clss){
        boolean flag = false;
        if (null == objects || objects.isEmpty()){
            return false;
        }
        try {

            daoSession.getDao(clss).deleteInTx(new Runnable() {
                @Override
                public void run() {
                    for(T object:objects){
                        daoSession.delete(object);
                    }
                }
            });
            flag = true;
        } catch (Exception e) {
            Log.e(TAG, e.toString());
            flag = false;
        }
        return flag;
    }

    /**************************數據庫查詢操作***********************/

    /**
     * 獲得某個表名
     * @return
     */
    public String getTablename(Class object){
        return daoSession.getDao(object).getTablename();
    }

    /**
     * 查詢某個ID的對象是否存在
     * @param
     * @return
     */
    public boolean isExitObject(long id,Class object){
        QueryBuilder qb = (QueryBuilder) daoSession.getDao(object).queryBuilder();
        qb.where(CustomerDao.Properties.Id.eq(id));
        long length = qb.buildCount().count();
        return length>0 ? true:false;
    }

    /**
     * 根據主鍵ID來查詢
     * @param id
     * @return
     */
    public T QueryById(long id,Class object){
        return (T) daoSession.getDao(object).loadByRowId(id);
    }

    /**
     * 查詢某條件下的對象
     * @param object
     * @return
     */
    public List QueryObject(Class object,String where,String...params){
        Object obj = null;
        List objects = null;
        try {
            obj = daoSession.getDao(object);
            if (null == obj){
                return null;
            }
            objects = daoSession.getDao(object).queryRaw(where,params);
        } catch (Exception e) {
            Log.e(TAG, e.toString());
        }

        return objects;
    }
    /**
     * 查詢所有對象
     * @param object
     * @return
     */
    public List QueryAll(Class object){
        List objects = null;
        try {
            objects = (List) daoSession.getDao(object).loadAll();
        } catch (Exception e) {
            Log.e(TAG,e.toString());
        }
        return objects;
    }

    /***************************關閉數據庫*************************/
    /**
     * 關閉數據庫一般在Odestory中使用
     */
    public void CloseDataBase(){
        manager.closeDataBase();
    }


}
(三)讓不同的數據表對象繼承BaseDao

 

其具體代碼如StudentManager.java以及CustomerManager.java所示(由於本Demo中這兩個Manager比較類似,所以只展示StudentManager.java)。

 

package com.jamy.DaoUtils;

import android.content.Context;

import com.jamy.dao.CustomerDao;
import com.jamy.entity.Customer;
import com.jamy.entity.Student;

import java.util.ArrayList;
import java.util.List;

import de.greenrobot.dao.query.QueryBuilder;

/**
 * Created by jamy on 16/6/16.
 * 在這個類中添加不同的查詢條件
 */
public class StudentManager extends BaseDao{
    public StudentManager(Context context) {
        super(context);
    }

    /***************************數據庫查詢*************************/

    /**
     * 通過ID查詢對象
     * @param id
     * @return
     */
    private Student loadById(long id){

       return daoSession.getStudentDao().load(id);
    }

    /**
     * 獲取某個對象的主鍵ID
     * @param student
     * @return
     */
    private long getID(Student student){

        return daoSession.getStudentDao().getKey(student);
    }

    /**
     * 通過名字獲取Customer對象
     * @return
     */
    private List getStudentByName(String key){
        QueryBuilder queryBuilder =  daoSession.getStudentDao().queryBuilder();
        queryBuilder.where(CustomerDao.Properties.Name.eq(key));
        int size = queryBuilder.list().size();
        if (size > 0){
            return queryBuilder.list();
        }else{
            return null;
        }
    }

    /**
     * 通過名字獲取Customer對象
     * @return
     */
    private List getIdByName(String key){
        List students = getStudentByName(key);
        List ids = new ArrayList();
        int size = students.size();
        if (size > 0){
            for (int i = 0;i < size;i++){
                ids.add(students.get(i).getId());
            }
            return ids;
        }else{
            return null;
        }
    }

    /***************************數據庫刪除*************************/

    /**
     * 根據ID進行數據庫的刪除操作
     * @param id
     */
    private void deleteById(long id){

        daoSession.getStudentDao().deleteByKey(id);
    }


    /**
     * 根據ID同步刪除數據庫操作
     * @param ids
     */
    private void deleteByIds(List ids){

        daoSession.getStudentDao().deleteByKeyInTx(ids);
    }

    /***********************************
     * 在次添加一些Student特有的數據庫操作語句
     * ************************************/

}
針對不同的數據表可以將一些特有的查詢條件放在StudentManager類中(因為不同的數據表可能需要的查詢條件不近相同),這樣方便查詢。

 

(四)將已創建的多表Manager對象封裝在一個類

其具體代碼如DaoUtils.java所示。

 

package com.jamy.DaoUtils;

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

import com.jamy.dao.CustomerDao;
import com.jamy.dao.DaoSession;
import com.jamy.dao.StudentDao;
import com.jamy.entity.Customer;
import com.jamy.entity.Student;

import java.util.ArrayList;
import java.util.List;

import de.greenrobot.dao.AbstractDao;
import de.greenrobot.dao.query.QueryBuilder;


/**
 * Created by jinfangmei on 2016/6/16.
 */
public class DaoUtils{
    private  static CustomerManager customerManager;
    private  static StudentManager studentManager;
    public  static Context context;

    public static void init(Context context){
        DaoUtils.context = context.getApplicationContext();
    }

    /**
     * 單列模式獲取CustomerManager對象
     * @return
     */
    public static CustomerManager getCustomerInstance(){
        if (customerManager == null) {
            customerManager = new CustomerManager(context);
        }
        return customerManager;
    }

    /**
     * 單列模式獲取StudentManager對象
     * @return
     */
    public static StudentManager getStudentInstance(){
        if (studentManager == null) {
            studentManager = new StudentManager(context);
        }
        return studentManager;
    }
}
上面有一點需注意,由於在DaoUtils中的Context是由static修飾,所以這裡的context要用ApplicationContext(防止Activity被結束而造成內存洩漏)。
上面的一步步封裝已經完成,下面在MainActivity中調用試試好不好用。哈哈。

 

MainActivity.java的具體代碼如下所示。

 

package com.jamy.testgreendao;
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.jamy.DaoUtils.DaoUtils;
import com.jamy.entity.Customer;
import com.jamy.entity.Student;
import java.util.ArrayList;
import java.util.List;



public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private Button mAddButton;
    public Button mDeleteButton,mUpdateButton,mQueryButton;
    private List

好了,調用了下,感覺還是不錯的。雖說不是很完美,但最起碼湊合湊合能用。以上就是鄙人對GreenDao進行的一些簡單的封裝,知道還不是很完善,希望各位多給批評建議,沒有你們的建議就沒有我的逐步成長。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved