android

Android 设置room的db文件存放路径

2019-09-25  本文已影响0人  坑逼的严

最近用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";
上一篇 下一篇

猜你喜欢

热点阅读