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

一、概述

在之前一个项目中,因为涉及到数据库,所以就接触到了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灵感也是从它而来,已经写的代码虽说有用到设计模式,但是概念都很模糊,个人感觉非常适合我这样的小白。

源码点击下载

时间: 2024-10-07 19:06:55

Android数据库框架GreenDao封装使用,易理解、易扩展的相关文章

Android数据库框架——GreenDao轻量级的对象关系映射框架,永久告别sqlite

Android数据库框架--GreenDao轻量级的对象关系映射框架,永久告别sqlite 前不久,我在写了ORMLite这个框架的博文 Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 但是对于我个人来说,我可能更加倾向于用GreenDao,所以今天也为大家带来了GreenDao的详细博客,希望大家喜欢,之前也详细介绍了ORM的思想,如果不明白可以先看一下前面的博文,这里就不多赘述了,我们新建一个工程 一.相关介绍 官方网站 : http://greendao

Android数据库框架——ORMLite轻量级的对象关系映射(ORM)Java包

Android数据库框架--ORMLite轻量级的对象关系映射(ORM)Java包 事实上,我想写数据库的念头已经很久了,在之前写了一个答题系统的小项目那只是初步的带了一下数据库,数据库是比较强大的,不是我们三言两语就能解决的,我一直想抽个时间自己再过一遍Sqlite和JDBC的,但是,大家也知道,琐事比较多,我们来说一下数据库的框架吧,事实上市面上,我觉得还可以的数据库框架有两个,ORMLite和GreenDao,我以前做的运动类的应用上,就需要存储大量的运动数据,我们最开始是在本地写数据库的

Android 数据库框架ormlite 使用精要

Android 数据库框架ormlite 使用精要 前言 本篇博客记录一下笔者在实际开发中使用到的一个数据库框架,这个可以让我们快速实现数据库操作,避免频繁手写sql,提高我们的开发效率,减少出错的机率. ormlite是什么? 首先可以去它的官网看看www.ormlite.com,它的英文全称是Object Relational Mapping,意思是对象关系映射:如果接触过Java EE开发的,一定知道Java Web开发就有一个类似的数据库映射框架--Hibernate.简单来说,就是我们

Android 数据库框架OrmLite的使用(一)

在这里记录下最基本的用法,官网上可了解相关的介绍. 1.下载OrmLite jar 在下载android的:ormlite-android-4.48.jar和ormlite-core-4.48.jar,放在你项目的libs目录下. 2.编写Bean类 package com.example.ormlite.bean; import java.util.Collection; import com.j256.ormlite.field.DatabaseField; import com.j256.

Android Orm框架(GreenDao)

Android Orm框架(GreenDao) 分类: android2014-04-10 14:29 723人阅读 评论(0) 收藏 举报 GreenDao与Ormlite对比 Ormlite:简单好用,比较符合JavaEE开发者使用习惯,注解很方便: GreenDao:为Android大大优化 ,最小的内存使用 ,非常高的性能优势. 官网地址:http://greendao-orm.com/features/ 项目地址:https://github.com/greenrobot/greenD

android高效ORM数据库框架greenDao使用

     因为项目中多处用到了数据库,需要对数据库频繁的读写操作,虽然android 自带的SQLiteOpenHelper的.这种方式比较方便易懂,但是在使用过程中需要写很多的sql语句,而且需要及时的关闭和释放资源,使用起来相对复杂,鉴于性能的考虑,决定采用一种ORM框架来解决,     在android中开源的数据库ORM解决方案中.主要有那么几种.综合各方面评价,觉得greenDao相对来说是一个综合考量最好的方案,所以决定试一下,     但是greenDao使用相关资料网上确实不多,

自己动手写Android数据库框架

前言 相信不少开发人员跟我一样,每次都非常烦恼自己写数据库,并且那些数据库语句也经常记不住.当然网上也有非常多非常好的数据库框架,你能够直接拿来用,可是 非常多时候我们的项目.特别是一个小型的Andrond应用原本用到的数据库结构比較简单,不是必需去用那些有点臃肿的框架.当然,即使你用那些框架.当你遇到问题时,你是否也得去改动它?你要改动别人的框架必须的读懂他人的设计代码.所以无论从那个角度出发,你都得掌握简单的数据库操作.那么这篇博客就从简单的数据库操作来学习Android数据库相关知识点.然

Android数据库框架-----ORMLite 的基本用法

ORMLite 是一款非要流行的Android平台上的数据库框架,性能优秀,代码简洁: 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完善:4.文档全面. 缺点:1.基于反射,效率较低(本人还没有觉得效率低):2.缺少中文翻译文档 准备工作: jar包 地址:http://ormlite.com/releases/ 集成方法:把jar包复制到as的libs文件夹下,并且引用jar包即可 之后创建一个类User,并完成相关配置 @DatabaseTable(tableName="tb_

Android ORM 框架——greenDAO

greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案. 官方网站http://greendao-orm.com/ 让我们开始吧: 一. 在 ANDROID 工程中配置「GREENDAO GENERATOR」模块 1,在 .src/main 目录下新建一个与 java 同层级的「java-gen」目录,用于存放由 greenDAO 生成的 Bean.DAO.DaoMaster.DaoSession 等类. 2,配置 Android 工程(app)的 buil