【问题标题】:SQLiteCantOpenDatabaseException Cannot open database : is not readableSQLiteCantOpenDatabaseException 无法打开数据库:不可读
【发布时间】:2022-07-25 14:51:37
【问题描述】:

我正在使用 Room DB 在 android 中本地保存数据。

现在,即使用户卸载应用程序或清除存储,我也想保留数据。

所以,我在以下位置创建了 Room DB。

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).getPath()

一切正常。

但是如果我清除存储或卸载应用程序并再次打开应用程序,我会收到以下错误。

原因:java.util.concurrent.ExecutionException:android.database.sqlite.SQLiteCantOpenDatabaseException:无法打开数据库'/storage/emulated/0/Download/database/hhcf':文件/storage/emulated/0/Download/数据库/hhcf 不可读

这个问题出现在 Android 11 中。对于 Android 9 没有异常。

我也授予了以下权限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

还有,

android:requestLegacyExternalStorage="true"

在应用程序标签中。

任何帮助将不胜感激。

【问题讨论】:

  • 嗨,你找到解决办法了吗?

标签: android database sqlite android-room android-11


【解决方案1】:

您需要请求用户权限才能获得此权限,仅在清单中添加它是行不通的,至少它不适合我。我做了这样的事情:

    @RequiresApi(api = Build.VERSION_CODES.R)
public void checkFileAccessPermission() {
    if (Environment.isExternalStorageManager()) {
        return;
    }
    Intent getPermission = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
    startActivityForResult(getPermission, 123);
}

这是来自这个帖子的解决方案:How to obtain MANAGE_EXTERNAL_STORAGE permission

但请记住,如果您希望您的应用出现在 google play 商店中,您需要向 google 证明您为什么需要此权限,如本文所述:https://support.google.com/googleplay/android-developer/answer/10467955?hl=en

如果您为文件使用其他路径,例如方法 getFilesDir(),您也不会遇到此问题,但只有在开发新应用或类似的情况下才有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    相关资源
    最近更新 更多