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



  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android 开发中,数据库操作是非常常见的任务。为了方便复用和维护,我们可以将数据库操作封装成一个工具类。以下是一个简单的数据库工具类封装示例: ```java public class DatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "my_database.db"; private static final int DATABASE_VERSION = 1; private static DatabaseHelper instance; private SQLiteDatabase database; private DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } public synchronized static DatabaseHelper getInstance(Context context) { if (instance == null) { instance = new DatabaseHelper(context.getApplicationContext()); } return instance; } public synchronized SQLiteDatabase open() { if (database == null || !database.isOpen()) { database = instance.getWritableDatabase(); } return database; } public synchronized void close() { if (database != null) { database.close(); database = null; } } @Override public void onCreate(SQLiteDatabase db) { // 创建数据库表 db.execSQL("CREATE TABLE my_table (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库升级操作 } } ``` 这个工具类继承自 `SQLiteOpenHelper` 类,重写了 `onCreate` 和 `onUpgrade` 方法,用于创建和升级数据库表。同时,这个工具类使用了单例模式和同步锁来保证数据库的安全性和线程安全性。 使用时,可以通过 `getInstance` 方法获取数据库实例,然后调用 `open` 方法打开数据库,进行相关的增删改查操作。最后要记得调用 `close` 方法关闭数据库连接,释放资源。 ```java DatabaseHelper dbHelper = DatabaseHelper.getInstance(context); SQLiteDatabase db = dbHelper.open(); // 执行增删改查操作 dbHelper.close(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值