Android GreenDao3自定义数据库路径SD卡

上一篇写过GreenDao2自定义数据库路径SD卡
是直接改DaoMaster文件,但是在GreenDao3中数据创建是通过gradle直接编辑生成数据库相关文件,会初始化DaoMaster文件,则那个方法不适用。

import android.content.ContextWrapper;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;

import com.yzzh.cateringsystem.YZApplication;
import com.yzzh.cateringsystem.utils.FileUtils;
import com.yzzh.cateringsystem.utils.LogUtil;

import java.io.File;
import java.io.IOException;

/**
 * @作者:TJ
 * @时间:2018-10-19-10:29
 * @描述:GreenDao3自定义数据库路径
 */
public class GreenDaoContext extends ContextWrapper {

    public GreenDaoContext() {
        super(YZApplication.getApplication());
    }

    /**
     * 获得数据库路径,如果不存在,则创建对象
     *
     * @param dbName
     */
    @Override
    public File getDatabasePath(String dbName) {
        String dbDir = FileUtils.getDBPath();
        LogUtil.e("GreenDaoContext", "数据库地址:" + dbDir);
        File baseFile = new File(dbDir);
        // 目录不存在则自动创建目录
        if (!baseFile.exists()) {
            baseFile.mkdirs();
        }
        //如果需要建立多个库,根据用户之类建立文件夹自行处理
        StringBuffer buffer = new StringBuffer();
        buffer.append(baseFile.getPath());
        dbDir = buffer.toString();
        buffer.append(File.separator);
        buffer.append(dbName);
        String dbPath = buffer.toString();
        // 判断目录是否存在,不存在则创建该目录
        File dirFile = new File(dbDir);
        if (!dirFile.exists()) {
            dirFile.mkdirs();
        }
        // 数据库文件是否创建成功
        boolean isFileCreateSuccess = false;
        // 判断文件是否存在,不存在则创建该文件
        File dbFile = new File(dbPath);
        if (!dbFile.exists()) {
            try {
                isFileCreateSuccess = dbFile.createNewFile();// 创建文件
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            isFileCreateSuccess = true;
        }
        //返回数据库文件对象
        if (isFileCreateSuccess) {
            return dbFile;
        } else {
            return super.getDatabasePath(dbName);
        }
    }

    /**
     * 重载这个方法,是用来打开SD卡上的数据库的,android 2.3及以下会调用这个方法。
     *
     * @param name
     * @param mode
     * @param factory
     */
    @Override
    public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) {
        SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), factory);
        return result;
    }

    /**
     * Android 4.0会调用此方法获取数据库。
     *
     * @param name
     * @param mode
     * @param factory
     * @param errorHandler
     * @see ContextWrapper#openOrCreateDatabase(String, int,
     * SQLiteDatabase.CursorFactory,
     * DatabaseErrorHandler)
     */
    @Override
    public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory,
                                               DatabaseErrorHandler errorHandler) {
        SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), factory);
        return result;
    }
}

然后在数据库初始化的时候调用

public void initDB(){
        DaoMaster.DevOpenHelper dbHelper = new DaoMaster.DevOpenHelper(
                new GreenDaoContext(), Constants.DB_NAME,null);
        mDatabase = dbHelper.getReadableDatabase();
        mDaoMaster = new DaoMaster(mDatabase);
        mDaoSession = mDaoMaster.newSession();
    }

你可能感兴趣的:(【Android工具】)