package com.bell.testgreendao.util.db;

import android.content.Context;

import com.bell.testgreendao.util.db.gen.DaoMaster;
import com.bell.testgreendao.util.db.gen.DaoSession;

import org.greenrobot.greendao.query.QueryBuilder;

/**
 * @Info 创建数据库、创建数据库表、包含增删改查的操作以及数据库的升级
 * @Auth Bello
 * @Time 17-11-2 下午2:12
 * @Ver
 */
public class DBManager {
    private static final String TAG = DBManager.class.getSimpleName();
    private static final String DB_NAME = "greendaotest";

    private Context mContext;

    //多线程中要被共享的使用volatile关键字修饰
    private volatile static DBManager manager = new DBManager();
    private static DaoMaster mDaoMaster;
    private static DaoMaster.DevOpenHelper mHelper;
    private static DaoSession mDaoSession;

    /**
     * 单例模式获得操作数据库对象
     * @return
     */
    public static DBManager getInstance(){
        return manager;
    }

    public void init(Context mContext){
        this.mContext = mContext;
    }

    /**
     * 判断是否存在数据库，如果没有则创建
     * @return
     */
    public DaoMaster getDaoMaster(){
        if (mDaoMaster == null){
            DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(mContext, DB_NAME, null);
            mDaoMaster = new DaoMaster(helper.getWritableDb());
        }
        return mDaoMaster;
    }

    /**
     * 完成对数据库的添加、删除、修改、查询操作
     * @return
     */
    public DaoSession getDaoSession(){
        if (mDaoSession ==null){
            if (mDaoMaster == null){
                mDaoMaster = getDaoMaster();
            }
            mDaoSession = mDaoMaster.newSession();
        }
        return mDaoSession;
    }


    /**
     * 关闭所有的操作，数据库开启后，使用完毕要关闭
     */
    public void closeConnection(){
        closeHelper();
        closeDaoSession();
    }

    public void closeHelper(){
        if (mHelper != null){
            mHelper.close();
            mHelper = null;
        }
    }

    public void closeDaoSession(){
        if (mDaoSession != null){
            mDaoSession.clear();
            mDaoSession = null;
        }
    }

    /**
     * 打开输出日志，默认关闭
     */
    public void setDebug(){
        QueryBuilder.LOG_SQL =  true;
        QueryBuilder.LOG_VALUES = true;
    }

}
