如何更改 Room 数据库的默认位置?

9
我想改变 Android Room 数据库的位置。我知道数据库在文件系统中,需要获得 root 权限,但我不想 root 手机。
我的想法是将数据库位置更改为 SD 卡,并且可以在不 root 手机的情况下访问它。

1
除了以下提到的要点外,请确保您在清单文件中拥有<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />权限。 - Naveen Kumar
2个回答

19

只需将位置路径放在数据库名称中即可。
例如:

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>

3
不,这不是正确的解决方案。它会导致错误,提示“无法打开数据库”。 - Gaju Kollur
我已经完成了这个,它运行得很好,如果不行,请提供正确的答案。 - joe06
我尝试了很多次这段代码,但它不起作用。我认为无法更改路径,因为ROOm是以这种方式设计的。 - Gaju Kollur
它工作了。只要不忘记权限(对于MM+的sd卡运行时权限)。 - vitidev
事实证明,在旧的API(大约从API 24开始)上使用 ContextWrapper 并覆盖 Context::getDatabasePath(name) 不起作用。在这个提交(来自2016年),openOrCreateDatabase 被更改为使用 getDatabasePath 而不是先前 getDatabasePath 委托给的私有方法 validateFilePath - ashughes
显示剩余7条评论

1

我也遇到了同样的问题。我使用的代码和@joe06一样。

我们唯一缺少的是在调用Room构建之前需要创建目录。

private fun setUpDirectory() {
        var dbDirectory =
            Environment.getExternalStorageDirectory().absolutePath + "/data/abc/databases/"
        var dbDirFile = File(dbDirectory)
        if (!dbDirFile.exists()) {
            dbDirFile.mkdirs()
        }
    }

创建目录后构建房间数据库将会在任何你想要的位置创建数据库。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接