关闭

[置顶] Android数据库框架GreenDao封装使用,易理解、易扩展

标签: 数据库GreenDaosqlite开源框架ORM
2898人阅读 评论(1) 收藏 举报
分类:

一、概述

在之前一个项目中,因为涉及到数据库,所以就接触到了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<Person> 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<Person> queryPerson(WhereCondition arg0,
                                  WhereCondition... conditions) {
        QueryBuilder<Person> qb = personDao.queryBuilder();
        qb.where(arg0, conditions);
        List<Person> 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<Person> qb = personDao.queryBuilder();
        DeleteQuery<Person> 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<Person> getPersonByName(String name) {
        List<Person> list = null;
        list = App.daoManager.queryPerson(PersonDao.Properties.Name.eq(name));
        return list;
    }

    // 查找排序
    public static List<Person> getPerson() {
        List<Person> 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<Person> 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灵感也是从它而来,已经写的代码虽说有用到设计模式,但是概念都很模糊,个人感觉非常适合我这样的小白。偷笑



5
1

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:35949次
    • 积分:684
    • 等级:
    • 排名:千里之外
    • 原创:22篇
    • 转载:2篇
    • 译文:0篇
    • 评论:24条