关闭

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

标签: 数据库GreenDaosqlite开源框架ORM
3241人阅读 评论(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
查看评论

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

  • 2016-04-13 13:55
  • 7.18MB
  • 下载

GreenDao3.x Demo 拓展了一部分数据库升级功能.

- 支持greenDAO3.x所有功能,未改写其代码 - 支持新增表 - 支持表字段增加和删除 - 支持增加表字段时,原有数据填充默认值
  • wxd_beijing
  • wxd_beijing
  • 2017-04-11 11:02
  • 387

1、GreenDao封装后使用

DaoManager /** * 1、创建数据库 * 2、创建数据库的表 * 3、包含对数据库的CRUD * 4、对数据库的升级 */ public class DaoManager { private static final String TAG = DaoManager...
  • IKNOWNU
  • IKNOWNU
  • 2016-08-03 20:11
  • 1431

GreenDao的实用封装

前面简单介绍了下GreenDao的使用,从前面的介绍看来是不是觉得有点 so easy。对就是这么简单。曾经有位大神说作为一位合格的程序员就要在学习别人的东西时,有点自己的想法。为了表示我是位比较合格的程序员,今天和大家介绍下GreenDao的比较实用的封装。如果您还没来得及学习greenDao的实...
  • Jamy2015
  • Jamy2015
  • 2016-06-23 16:27
  • 6664

GreenDao数据库框架 最精简使用教程 并对其进行简单封装

GreenDao框架的使用步骤:(android studio)1.首先在project的build.gradle下进行添加如下依赖:dependencies { classpath 'org.greenrobot:greendao-gradle-plugin:3.1.1' ...
  • zheweixingzhang
  • zheweixingzhang
  • 2016-09-10 23:08
  • 2372

Android ORM框架介绍之greenDao封装(二)

Android ORM框架介绍之greenDao封装(二)数据库操作增删改查操作重复太高,所以需要进行抽取,通过DataBaseManager统一管理。package www.weshared.greendao;import android.content.Context; import andro...
  • qq_33689414
  • qq_33689414
  • 2016-08-24 10:51
  • 1126

封装篇——DataBase 数据库整理(greenDao示例)

今天心情烦躁,一直在想着怎么起本篇博文的开头… 之前有在做一个即时通讯的功能,既然是即时通讯吧,那么就需要存储数据在本地咯,所以就有了关于数据库使用的一个简单封装,今天抽空整理了一下思路,故而有了本文。本文将从 数据库基础接口抽离,greenDao知识,greenDao的个性化基类封装和一个简单示...
  • sinat_15877283
  • sinat_15877283
  • 2016-04-08 17:43
  • 5450

Android——Greendao封装进行

关于GreenDao greenDao是一个将对象映射到SQLite数据库中的轻量且快速的ORM解决方案。 关于greenDAO的概念可以看官网greenDAO greenDAO 优势 1、一个精简的库 2、性能最大化 3、内存开销最小化 4、易于使用的 APIs 5、对 A...
  • xy8199
  • xy8199
  • 2017-12-01 20:25
  • 164

MVP+Dagger2+Rxjava+Retrofit+GreenDao 开发的小应用,包含新闻、图片、视频3个大模块,代码封装良好

练习MVP架构开发的App,算是对自己学过的知识做一个总结,做了有一段时间,界面还算挺多的,代码量还是有的,里面做了大量封装,整体代码整理得很干净,这个我已经尽力整理了。不管是文件(java、xml、资源文件)命名,还是布局设计尽量简单简洁,我对自己写代码的规范还是有信心的- -。代码不会写的很复杂...
  • github_35180164
  • github_35180164
  • 2017-02-11 15:55
  • 6212

GreenDao深入使用

本文在CSDN博客首发 转载请注明出处 http://blog.csdn.net/u011071427/article/details/54574171 本文出自Allen李的博客 GrenDao的深入使用 在本文中将会讲解一些使用GreenDao的FAQ 混淆 ### greenDA...
  • jackzhang_0522
  • jackzhang_0522
  • 2017-03-17 15:00
  • 723
    个人资料
    • 访问:49984次
    • 积分:858
    • 等级:
    • 排名:千里之外
    • 原创:24篇
    • 转载:2篇
    • 译文:0篇
    • 评论:28条