最近用room用的多,很方便,百度也搜的多,在网上也看到了这个问题,这个问题我们从源码出发寻找答案。
开始我们以配置room的文件名方法出发,看看这个name到底在最后起到什么作用
image.png
进入
image.png
在进入RoomDatabase.Builder
image.png
最后发现在build方法中用到了
image.png
继续进入DatabaseConfiguration的构造方法
最后跟踪到AppDatabase子类的validateMigration方法
image.png
最后我们看看configuration.sqliteOpenHelperFactory.create是做了什么
image.png
可以看出这里new了FrameworkSQLiteOpenHelper实例,那我们进入到他的构造方法中
中间沿着name走,最后动了SQLiteOpenHelper类的getDatabaseLocked方法
image.png
注意这句mContext.getDatabasePath(mName),我们继续跟进,来到ContextImpl对应方法中。
@Override
public File getDatabasePath(String name) {
return validateFilePath(name, false);
}
private File validateFilePath(String name, boolean createDirectory) {
File dir;
File f;
if (name.charAt(0) == File.separatorChar) {
String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar));
dir = new File(dirPath);
name = name.substring(name.lastIndexOf(File.separatorChar));
f = new File(dir, name);
} else {
dir = getDatabasesDir();
f = makeFilename(dir, name);
}
if (createDirectory && !dir.isDirectory() && dir.mkdir()) {
FileUtils.setPermissions(dir.getPath(),
FileUtils.S_IRWXU|FileUtils.S_IRWXG|FileUtils.S_IXOTH,
-1, -1);
}
return f;
}
简单的代码,意思是原来Android本身已经实现了自定义路径的方法了,只要传入的path的第一个字符为"/"就行了。
所以我的项目中将db文件存入到了外置sd卡,代码如下
String dbPath = "maixinxi.db";
if(Tools.existSDCard()){
dbPath = Configure.MAIXINXI_DIR+ File.separator+"dataBase"+File.separator+"maixinxi.db";
}
mAppDatabase = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, dbPath)
.allowMainThreadQueries()
.build();
//其中MAIXINXI_DIR为
//public static final String MAIXINXI_DIR=Environment.getExternalStorageDirectory().getPath()+ File.separator+"maixinxi";