Android數據庫GreenDao,封裝實踐

一、首先就是GreenDao環境的集成

GreenDao 地址
Demo包下載地址
環境集成比較簡單,如下
首先在項目下的build.gradle文件中:

 //GreenDao3依賴
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'

模塊的build.gradle文件中:


apply plugin: 'org.greenrobot.greendao'
//greenDao配置
greendao {
     //指定數據庫schema版本號,遷移等操作會用到;
     schemaVersion 1
     //dao的包名,包名默認是entity所在的包;
     daoPackage 'com.gz.greendao'
     //生成數據庫文件的目錄;
     targetGenDir 'src/main/java'
 }
 //greendao依賴
 implementation 'org.greenrobot:greendao:3.2.2'

二、對GreenDao進行操作的封裝

定義數據庫的實體類

@Entity 
public class StudentEntry {
    @Id(autoincrement = true) //自增使用Long類型,不能用long
    private Long id;
    @Property
    private String name;
    @Property
    private String sex;
    @Property
    private String age;

    @Generated(hash = 1678909457) //點擊make project自動生成
    public StudentEntry(Long id, String name, String sex, String age) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.age = age;
    }

    @Generated(hash = 2045720414)//點擊make project自動生成
    public StudentEntry() {
    }
}

點擊build下的Make Project後:
會在com.gz.greendao下生成DaoMaster.java、DaoSession.java、以及對應類的Dao文件(StudentEntryDao.java)

三、對數據庫的增刪改查方法進行封裝

1. 首先封裝一個DaoManager文件,進行管理數據庫

public class DaoManager {
    private static final String DB_NAME = "student.db";//數據庫名稱
    private static DaoManager mDaoManager;
    private DaoMaster.DevOpenHelper mHelper;
    private DaoMaster mDaoMaster;
    private DaoSession mDaoSession;
    private Context context;
    public DaoManager(Context context) {
        this.context = context;
    }
    /**
     * 獲得操作數據庫的對象
     * @return
     */
    public static DaoManager getInstance(Context context) {
        if (mDaoManager == null) {
            synchronized (DaoManager.class) {
                if (mDaoManager == null) {
                    mDaoManager = new DaoManager(context);
                }
            }
        }
        return mDaoManager;
    }
    /**
     * 獲取DaoSession
     *
     * @return
     */
    public synchronized DaoSession getDaoSession() {
        if (null == mDaoSession) {
            mDaoSession = getDaoMaster().newSession();
        }
        return mDaoSession;
    }
    /**
     * 設置debug模式開啓或關閉,默認關閉
     *
     * @param flag
     */
    public  void setDebug(boolean flag) {
        QueryBuilder.LOG_SQL = flag;
        QueryBuilder.LOG_VALUES = flag;
    }
    /**
     * 關閉數據庫
     */
    public synchronized void closeDataBase() {
        closeHelper();
        closeDaoSession();
    }
    /**
     * 判斷數據庫是否存在,如果不存在則創建
     *
     * @return
     */
    private DaoMaster getDaoMaster() {
        if (null == mDaoMaster) {
            mHelper = new DaoMaster.DevOpenHelper(context, DB_NAME, null);
            mDaoMaster = new DaoMaster(mHelper.getWritableDb());
        }
        return mDaoMaster;
    }
    private void closeDaoSession() {
        if (null != mDaoSession) {
            mDaoSession.clear();
            mDaoSession = null;
        }
    }
    private void closeHelper() {
        if (mHelper != null) {
            mHelper.close();
            mHelper = null;
        }
    }
}

2. 封裝常用的數據庫操作方法BaseBeanManager
包含基本的增刪改查操作

public class BaseBeanManager<T,K> {
    private AbstractDao<T,K> mDao;
    public BaseBeanManager(AbstractDao<T, K> mDao) {
        this.mDao = mDao;
    }
    public void save(T item){
        mDao.save(item);
    }
    public void save(T... items){
        mDao.insertInTx(items);
    }
    public void save(List<T> items){
        mDao.insertInTx(items);
    }
    public void update(T item) {
        mDao.update(item);
    }
    public void update(T... items) {
        mDao.updateInTx(items);
    }
    public void update(List<T> items) {
        mDao.updateInTx(items);
    }
    public void saveOrUpdate(T t){
        mDao.insertOrReplace(t);
    }
    public void saveOrUpdate(T... items) {
        mDao.insertOrReplaceInTx(items);
    }
    public void saveOrUpdate(List<T> items) {
        mDao.insertOrReplaceInTx(items);
    }
    public T query(K key){
        return mDao.load(key);
    }
    public  List<T> queryAll() {
        return mDao.loadAll();
    }
    public List<T> query(String where, String... params) {

        return mDao.queryRaw(where, params);
    }
    public QueryBuilder<T> queryBuilder() {
        return mDao.queryBuilder();
    }
    public long count() {
        return mDao.count();
    }
    public void refresh(T item) {
        mDao.refresh(item);

    }
    public void detach(T item) {
        mDao.detach(item);
    }
    public void deleteByKey(K key) {
        mDao.deleteByKey(key);
    }
    public void delete(T item) {
        mDao.delete(item);
    }
    public void delete(T... items) {
        mDao.deleteInTx(items);
    }
    public void delete(List<T> items) {
        mDao.deleteInTx(items);
    }
    public void deleteAll() {
        mDao.deleteAll();
    }
}

3. 創建一個數據庫實體類,就需要創建一個Manager進行管理

public class StudentManager extends BaseBeanManager<StudentEntry,Long> {

    public StudentManager(AbstractDao mDao) {
        super(mDao);
    }
    @Override
    public QueryBuilder<StudentEntry> queryBuilder() {
        return super.queryBuilder();
    }
}

4. 創建ManagerFactory,將所有的管理類放在一起

public class ManagerFactory {
    /**
     * 每一個BeanManager都管理着數據庫中的一個表,我將這些管理者在ManagerFactory中進行統一管理
     */
    StudentManager studentManager;
    TeacherManager teacherManager;
    private static ManagerFactory mInstance = null;
    /**
     * 獲取DaoFactory的實例
     *
     * @return
     */
    public static ManagerFactory getInstance() {
        if (mInstance == null) {
            synchronized (ManagerFactory.class) {
                if (mInstance == null) {
                    mInstance = new ManagerFactory();
                }
            }
        }
        return mInstance;
    }
    public synchronized StudentManager getStudentManager() {
        if (studentManager == null){
            studentManager = new StudentManager(DaoManager.getInstance(MyApplication.getContext()).getDaoSession().getStudentEntryDao());
        }
        return studentManager;
    }
    public synchronized TeacherManager getTeacherManager(){
        if (teacherManager == null){
            teacherManager = new TeacherManager(DaoManager.getInstance(MyApplication.getContext()).getDaoSession().getTeacherEntryDao());
        }
        return teacherManager;
    }
}

5. 簡單使用:
對於具體的查詢,需要在相關的父類進行重寫該方法,這裏StudentManager中重寫了queryBuilder的方法。

//根據名字進行查詢
StudentEntry stu = factory.getStudentManager().queryBuilder()
                        .where(StudentEntryDao.Properties.Name.eq("張三")).build().unique();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章