上一篇写过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();
}