应用数据库管理ORM框架---GreenDao的使用

1、greenDao介绍

    移动开发的时候经常涉及到了数据库操作,通常我们会使用SQLiteOpenHelper定义数据库的操作,其中需要重写onCreate以及onUpgrade方法,创建相关的表格或者对数据库进行更新;之后还需要对数据库进行CRUD操作,如果将对象进行了封装操作,还需要进一步将查询结果封装到实体类中,显得特别的麻烦;而greenDao就是典型的一个ORM框架方便我们的使用。

2、使用步骤(使用框架自动生成相关的文件)

    具体可以参考使用框架引入GreenDao

    当然我们也可以自己新建一个java模块以生成相关的Dao文件;

    2.1 新建一个java module;在java module的gradle文件中添加

compile('de.greenrobot:DaoGenerator:1.3.0')
    2.2 在java文件中实现main方法,在此方法中实现数据库以及表格的创建,相关代码如下:

package com.example;

import de.greenrobot.daogenerator.DaoGenerator;
import de.greenrobot.daogenerator.Entity;
import de.greenrobot.daogenerator.Schema;

public class Main {

    public static void main(String[] args) throws Exception {

        /**
         * 第一个参数表示数据库版本,只能++或者卸载
         * 第二个参数表示默认生成相关文件的package
         */
        Schema schema = new Schema(1, "db");

        /**
         * 通过Schema实例创建相关的表格
         */
        initUserBean(schema);

        /**
         * 指定相关文件生成的路径
         * 注意:new Schema(1, "db")的第二个参数也是默认package,相关文件的生成路径是:第二个参数 + "db"
         */
        new DaoGenerator().generateAll(schema, "F:\\AndroidStudioWrokspace\\GreenDao\\app\\src\\main\\java\\com\\wrx");
    }

    private static void initUserBean(Schema schema) {
        /**
         * 创建表格名称
         */
        Entity entry = schema.addEntity("User");
        /**
         * 为表格添加相关属性
         */
        entry.addIdProperty();
        entry.addStringProperty("name");
        entry.addIntProperty("age");
    }

}
    main方法完成后,就可以执行该main函数,结果是会在执行的目录下生成相关的dao文件,其中包括一个DaoMaster、DaoSession、Bean以及BeanDao;

3、使用生成的文件创建数据库以及表

    通过以下代码就可以在应用中创建相关的数据库文件:

DaoMaster.DevOpenHelper openHelper = new DaoMaster.DevOpenHelper(context, Contacts.DB_NAME, null);
DaoMaster sDaoMaster = new DaoMaster(openHelper.getWritableDatabase());
DaoSession sDaoSession = sDaoMaster.newSession();
    如果需要对某个表进行相关的CRUD操作就可以通过DaoSession实例,获取相应得BeanDao,调用不同的方法执行不同的操作;当然,如果每个操作的地方都这样写,不能保证DaoMaster以及DaoSession的实例的唯一性,所以我们可以在Application中通过简单的单例模式控制他们的实例,当然也可以自己写一个类控制他们:

package greendao;

import android.content.Context;

/**
* Created by Administrator on 2016/4/26.
        */
public class DaoHelper {

    private static DaoMaster sDaoMaster;
    private static DaoSession sDaoSession;

    public static synchronized DaoMaster getDaoMaster(Context context) {
        if (sDaoMaster == null) {
            DaoMaster.DevOpenHelper openHelper = new DaoMaster.DevOpenHelper(context, Contacts.DB_NAME, null);
            sDaoMaster = new DaoMaster(openHelper.getWritableDatabase());
        }
        return sDaoMaster;
    }

    public static synchronized DaoSession getDaoSession(Context context) {
        if (sDaoSession == null) {
            if (sDaoMaster == null) {
                sDaoMaster = getDaoMaster(context);
            }
            sDaoSession = sDaoMaster.newSession();
        }
        return sDaoSession;
    }

    public static void cleanDB() {
        sDaoMaster = null;
        sDaoSession = null;
    }
}
    另外,如果你到Daomaster里面去看,会发现这里还有个问题:

DaoMaster.DevOpenHelper openHelper = new DaoMaster.DevOpenHelper(context, Contacts.DB_NAME, null);
/** WARNING: Drops all table on Upgrade! Use only during development. */
public static class DevOpenHelper extends OpenHelper {
    public DevOpenHelper(Context context, String name, CursorFactory factory) {
        super(context, name, factory);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
        dropAllTables(db, true);
        onCreate(db);
    }
}
你会发现在数据库更新的时候,这里只是简单的先删除所有的表格,再重新新建;这就会导致数据库升级的时候,以前插入的数据都会被清空,为了解决该问题,我们可以继承DevOpenHelper类,重写onUpgrade方法,创建数据库的时候使用DevOpenHelper的子类就可以了:

package greendao;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

/**
 * Created by Administrator on 2016/4/25.
 * 因为默认的greenDao生成的OpenHelper数据库操作,在进行更新的时候会先删除原来的表,再创建(为了防止丢失数据)
 */
public class MyDevOpenHelper extends DaoMaster.DevOpenHelper {

    public MyDevOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
        super(context, name, factory);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.i("wrx153", "oldVersion" + oldVersion);
        Log.i("wrx153", "newVersion" + newVersion);
        switch (oldVersion) {
            case 0:
                //创建新表
                //为表增加字段
                break;
        }
    }
}
4、使用BeanDao提供的方法实现CRUD

4.1、查询

/**
 *通过key值获取Bean
 */
public Box loadBox(long key) {
    return mBoxDao.load(key);
}

/**
 *得到数据库中所有的Bean
 */
public List<Box> loadAllBox() {
    return mBoxDao.loadAll();
}

/**
 *通过where语句查询
 */
public List<Box> queryBox(String where, String... params) {
    return mBoxDao.queryRaw(where, params);
}

/**
 *通过QueryBuilder查询
 */
public List<Box> queryBuilderBox(){
    QueryBuilder builder = mBoxDao.queryBuilder()
            .where(BoxDao.Properties.Id.gt(5));
    return builder.list();
}
4.2 保存
public long saveBox(Box box) {
        return mBoxDao.insertOrReplace(box);
    }

    public void saveBoxList(final List<Box> list) {
        if (list == null || list.size() == 0) {
            return;
        }
        mBoxDao.getSession().runInTx(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < list.size(); i++) {
                    Box box = list.get(i);
                    mBoxDao.insertOrReplace(box);
                }
            }
        });
    }
4.3 删除

public void deleteAllBox() {
        mBoxDao.deleteAll();
    }
    
    public void deleteBox(long key) {
        mBoxDao.deleteByKey(key);
    }
    
    public void deleteBox(Box box) {
        mBoxDao.delete(box);
    }

完整代码如下:

package greendao;

import android.content.Context;

import java.util.List;

import de.greenrobot.dao.query.QueryBuilder;

/**
 * Created by Administrator on 2016/4/26.
 */
public class BoxDaoManager {

    private static BoxDaoManager sBoxDaoManager;
    private BoxDao mBoxDao;

    private BoxDaoManager() {
    }

    public static BoxDaoManager getInstance(Context context) {
        if (sBoxDaoManager == null) {
            sBoxDaoManager = new BoxDaoManager();
        }
        sBoxDaoManager.mBoxDao = DaoHelper.getDaoSession(context).getBoxDao();

        return sBoxDaoManager;
    }

    /**
     *通过key值获取Bean
     */
    public Box loadBox(long key) {
        return mBoxDao.load(key);
    }

    /**
     *得到数据库中所有的Bean
     */
    public List<Box> loadAllBox() {
        return mBoxDao.loadAll();
    }

    /**
     *通过where语句查询
     */
    public List<Box> queryBox(String where, String... params) {
        return mBoxDao.queryRaw(where, params);
    }

    /**
     *通过QueryBuilder查询
     */
    public List<Box> queryBuilderBox(){
        QueryBuilder builder = mBoxDao.queryBuilder()
                .where(BoxDao.Properties.Id.gt(5));
        return builder.list();
    }

    public long saveBox(Box box) {
        return mBoxDao.insertOrReplace(box);
    }

    public void saveBoxList(final List<Box> list) {
        if (list == null || list.size() == 0) {
            return;
        }
        mBoxDao.getSession().runInTx(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < list.size(); i++) {
                    Box box = list.get(i);
                    mBoxDao.insertOrReplace(box);
                }
            }
        });
    }

    public void deleteAllBox() {
        mBoxDao.deleteAll();
    }

    public void deleteBox(long key) {
        mBoxDao.deleteByKey(key);
    }

    public void deleteBox(Box box) {
        mBoxDao.delete(box);
    }
}


参考:在AndroidStudio中引入GreenDao

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值