我想改变 Android Room 数据库的位置。我知道数据库在文件系统中,需要获得 root 权限,但我不想 root 手机。
我的想法是将数据库位置更改为 SD 卡,并且可以在不 root 手机的情况下访问它。
我的想法是将数据库位置更改为 SD 卡,并且可以在不 root 手机的情况下访问它。
只需将位置路径放在数据库名称中即可。
例如:
AppDatabase db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "database-name").build();
AppDatabase db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "/storage/emulated/0/folder/database-name").build();
不要忘记为应用程序授予写入权限。
感谢 @vitidev
更新
如果您的目标是 Android 10 或更高版本,请在您的应用程序清单文件中将 requestLegacyExternalStorage 的值设置为 true:
<manifest ... >
<!-- This attribute is "false" by default on apps targeting
Android 10 or higher. -->
<application android:requestLegacyExternalStorage="true" ... >
...
</application>
</manifest>
ContextWrapper
并覆盖 Context::getDatabasePath(name)
不起作用。在这个提交(来自2016年),openOrCreateDatabase
被更改为使用 getDatabasePath
而不是先前 getDatabasePath
委托给的私有方法 validateFilePath
。 - ashughes我也遇到了同样的问题。我使用的代码和@joe06一样。
我们唯一缺少的是在调用Room构建之前需要创建目录。
private fun setUpDirectory() {
var dbDirectory =
Environment.getExternalStorageDirectory().absolutePath + "/data/abc/databases/"
var dbDirFile = File(dbDirectory)
if (!dbDirFile.exists()) {
dbDirFile.mkdirs()
}
}
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
权限。 - Naveen Kumar