Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android數據庫框架GreenDao封裝使用,易理解、易擴展

Android數據庫框架GreenDao封裝使用,易理解、易擴展

編輯:關於Android編程

一、概述

在之前一個項目中,因為涉及到數據庫,所以就接觸到了ORM框架的GreenDao。後面就去網上大量的搜索下載學習,發現很多都是官網的翻譯或者是官網DEMO的簡單入門講解,而且對於小白,也不知道從何下手,最終還是放棄選擇了本地sqlite偷笑。 時隔不久,GreenDao的應用已經是家常便飯了,於是乎,在上個周末就抽取了些時間對官網的DEMO進行拆解封裝,並且完善了功能,盡可能的易於理解和擴展,方便以後直接拿來用。得意

二、效果圖

下圖addData/deleteData/changeData/queryData(分別對應數據庫的增、刪、改、查效果),由於時間上的原因,沒有界面效果圖。在這上面花費太多時間,也是因為這個才想分享給大家,後面大家可以自行下載添加

\\

三、代碼

工程主要分為三部分文件:dao(官方demo生成類)、manager(具體功能實現類)、utils(封裝操作類) dao就不曬代碼了,跟官網的差不多。manager文件夾中有App和DaoManager類,App主要是初始化新建數據庫,DaoManager負責具體實現數據庫操作功能。 App類:
package com.example.jekin.greendao.manager;

import android.app.Application;
import android.content.Context;

import com.example.jekin.greendao.dao.DaoMaster;
import com.example.jekin.greendao.dao.DaoSession;

/**
 * Created by JeKin on 2016/4/8.
 */
public class App extends Application{
    public static App mInstance;
    public static DaoMaster daoMaster;
    public static DaoSession daoSession;
    public static DaoManager daoManager;

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
        daoManager = DaoManager.getInstance(getApplicationContext());
    }

    /**
     * 取得DaoMaster
     *
     * @param context
     * @return daoMaster
     */
    public static DaoMaster getDaoMaster(Context context) {
        DaoMaster.OpenHelper helper = new DaoMaster.DevOpenHelper(context, "person.db", null);
        daoMaster = new DaoMaster(helper.getWritableDatabase());
        return daoMaster;
    }

    /**
     * 取得DaoSession
     *
     * @param context
     * @return daoSession
     */
    public static DaoSession getDaoSession(Context context) {
        if (daoSession == null) {
            if (daoMaster == null) {
                daoMaster = getDaoMaster(context);
            }
            daoSession = daoMaster.newSession();
        }
        return daoSession;
    }
}
DaoManager類:
package com.example.jekin.greendao.manager;

import android.content.Context;

import com.example.jekin.greendao.dao.DaoSession;
import com.example.jekin.greendao.dao.Person;
import com.example.jekin.greendao.dao.PersonDao;

import java.util.List;

import de.greenrobot.mydao.query.DeleteQuery;
import de.greenrobot.mydao.query.QueryBuilder;
import de.greenrobot.mydao.query.WhereCondition;

/**
 * Created by JeKin on 2016/4/8.
 * 功能實現類
 */
public class DaoManager {
    private static DaoManager instance;
    private static Context appContext;
    private DaoSession mDaoSession;
    private PersonDao personDao;

    public DaoManager(){

    }

    public static DaoManager getInstance(Context context){
        if (instance == null){
            instance = new DaoManager();
            if (appContext == null) {
                appContext = context.getApplicationContext();
            }
            instance.mDaoSession = App.getDaoSession(context);
            instance.personDao = instance.mDaoSession.getPersonDao();
        }
        return instance;
    }

    /**
     * ================Person====================*
     */

    public List orderAscPerson() {
        return personDao.queryBuilder().orderAsc(PersonDao.Properties.Id).list();
    }

    /**
     * Person插入功能
     *
     * @return
     * @param:album
     */
    public void insertPerson(Person person) {
        personDao.insert(person);
    }

    public void insertOrReplacePerson(Person person) {
        personDao.insertOrReplaceInTx(person);
    }

    public void updatePerson(Person person) {
        personDao.update(person);
    }

    /**
     * Person查找功能
     * //查找條件
     * @param arg0
     * @param conditions
     * @return:albumList
     */
    public List queryPerson(WhereCondition arg0,
                                  WhereCondition... conditions) {
        QueryBuilder qb = personDao.queryBuilder();
        qb.where(arg0, conditions);
        List personList = qb.list();

        return personList;
    }

    /**
     * Person刪除所有功能
     *
     * @param
     * @return
     */
    public void deleteAllPerson() {
        personDao.deleteAll();
    }

    /**
     * Person刪除功能
     *
     * @return
     * @param:album
     */
    public void deletePerson(Person person) {
        personDao.delete(person);
    }

    public void deletePersonByName(String name) {
        QueryBuilder qb = personDao.queryBuilder();
        DeleteQuery bd = qb.where(PersonDao.Properties.Name.eq(name))
                .buildDelete();
        bd.executeDeleteWithoutDetachingEntities();
    }
}
utils文件夾下只有DaoUtils封裝類,易於後期擴展,懂點單詞的都很容易看懂
package com.example.jekin.greendao.utils;

import com.example.jekin.greendao.dao.Person;
import com.example.jekin.greendao.dao.PersonDao;
import com.example.jekin.greendao.dao.JsonCode;
import com.example.jekin.greendao.manager.App;

import java.util.List;

/**
 * Created by JeKin on 2016/4/8.
 * 對數據庫的實現進行封裝,隱藏實現細節
 */
public class DaoUtils {

    //===================getPersonDao========================
    public static List getPersonByName(String name) {
        List list = null;
        list = App.daoManager.queryPerson(PersonDao.Properties.Name.eq(name));
        return list;
    }

    // 查找排序
    public static List getPerson() {
        List personList = null;
        personList = App.daoManager.orderAscPerson();
        return personList;
    }

    //==============================insertDao====================================
    public static void insertPersonDao(JsonCode jsonCode) {
        // 添加數據
        for (int i = 0; i < jsonCode.getPerson().size(); i++) {
            App.daoManager.insertPerson(jsonCode.getPerson().get(i));
        }
    }

    public static boolean checkPersonExistAndUpdate(String name) {
        List personList = App.daoManager.queryPerson(PersonDao.Properties.Name.eq(name));
        if (personList.size() > 0) {
            for (int i = 0; i < personList.size(); i++) {
                Person person = new Person(personList.get(i).getId(), personList.get(i).getName(), personList.get(i).getHigh(), personList.get(i).getAge());
                App.daoManager.insertOrReplacePerson(person);
            }
            return true;
        }
        return false;
    }
}
最後就是我們的老大出場了,主要代碼就四句微笑 MainActivity:
package com.example.jekin.greendao;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import com.example.jekin.greendao.dao.Person;
import com.example.jekin.greendao.dao.JsonCode;
import com.example.jekin.greendao.manager.App;
import com.example.jekin.greendao.utils.DaoUtils;
import com.google.gson.Gson;

import java.util.ArrayList;

/**
 * Created by JeKin on 2016/04/12
 * 數據操作類
 */
public class MainActivity extends AppCompatActivity {
    private static final String TAG1 = "addData";
    private static final String TAG2 = "deleteData";
    private static final String TAG3 = "changeData";
    private static final String TAG4 = "queryData";
    // 模擬JSON數據
    private String jsonString = "{'code':'200','success':'true','Person':[{'name':'jekin','high':'173','age':'23'},{'name':'mike','high':'178','age':'24'}]}";
    // 查找數據的條件
    private String name = "mike";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        JsonCode jsonCode = new Gson().fromJson(jsonString, JsonCode.class);
        // 添加數據
        // 檢查是否已經存在該Person對象,不存在則插入
        boolean isExist = DaoUtils.checkPersonExistAndUpdate(name);
        if (!isExist) {
            DaoUtils.insertPersonDao(jsonCode);
        }

        // 增加之後查找數據
        for (Person person :
                DaoUtils.getPerson()) {
            Log.e(TAG1, person.getId().toString());
            Log.e(TAG1, person.getName().toString());
            Log.e(TAG1, person.getHigh().toString());
            Log.e(TAG1, person.getAge().toString());
        }

        // 條件刪除
        App.daoManager.deletePersonByName(name);
        for (Person person :
                DaoUtils.getPerson()) {
            Log.e(TAG2, person.getId().toString());
            Log.e(TAG2, person.getName().toString());
            Log.e(TAG2, person.getHigh().toString());
            Log.e(TAG2, person.getAge().toString());
        }

        // 條件修改
        if (DaoUtils.checkPersonExistAndUpdate(name)) {

            for (Person person :
                    DaoUtils.getPersonByName(name)) {
                Log.e(TAG3, person.getId().toString());
                Log.e(TAG3, person.getName().toString());
                Log.e(TAG3, person.getHigh().toString());
                Log.e(TAG3, person.getAge().toString());
            }
        }

        // 修改之後查詢語句
        for (Person person :
                DaoUtils.getPerson()) {
            Log.e(TAG4, person.getId().toString());
            Log.e(TAG4, person.getName().toString());
            Log.e(TAG4, person.getHigh().toString());
            Log.e(TAG4, person.getAge().toString());
        }

    }
}

四、結論

沒有界面,所以就渣渣的在LogCat輸出查看而已,json數據是模擬數據,如果涉及到網絡數據那就不方便大家看到效果了,請見諒。後期擴展的話,只需要在dao文件夾下增加相應的實體類和xxDao綁定數據類,如果還需要其他數據操作功能,可以在DaoUtils實現(可參考Person,代碼中主要以該對象為例)。以上是個人對GreenDao的總結,希望能幫助更多的同胞。代碼如果存在什麼問題,請及時指出,不要給各位留下什麼坑,這也是第二次寫博客,多多指教! 最後,推薦大家去看一本《Android設計模式》的書,因為寫這個demo靈感也是從它而來,已經寫的代碼雖說有用到設計模式,但是概念都很模糊,個人感覺非常適合我這樣的小白。偷笑
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved