无法以读/写模式打开数据库

问题描述 投票:0回答:4

我收到以下错误:

不是错误(代码 0):无法以读/写模式打开数据库。

我已经添加了

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

我正在尝试在 SD 卡中存在的数据库中输入数据,我可以通过“OPEN_READONLY”读取数据库中已存在的数据。我在使用“OPEN_READWRITE”时遇到错误

android android-sqlite
4个回答
3
投票

你的问题不太清楚,但我会尽力回答。

最有可能的是,您的数据库:

  1. 还不存在,你必须创建它;
  2. 您的数据库文件是只读的,您必须更改它(这个问题可能相关)。

对于#2,不要使用

SQLiteOpenHelper#getReadableDatabase()
,而是使用
SQLiteOpenHelper#getWritableDatabase


如果您的数据库位于外部存储单元上,则还需要检查其他一些事项:

  1. 当前是否已安装外部存储?如果没有,您将无法访问数据库。
  2. 是否以只读方式安装?如果是这样,您必须更改此设置。
  3. 您检查过路径吗?正确吗?

问题可能出在这些主题中的任何一个上。

要检查它是否以只读方式安装,请尝试以下操作:

/* Checks if external storage is available for read and write */
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state) ||
        Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        return true;
    }
    return false;
}

取自此处

有关

Environment
课程的更多信息,请参阅文档


1
投票

在 Android API 4.3 及更低版本中,您可以打开外部 SD 卡中的数据库,此代码适用于读写:

SQLiteDatabase.openDatabase(DB_PATH, null,SQLiteDatabase.NO_LOCALIZED_COLLATORS);

从 API 4.4 开始,您只能以 READ_ONLY 打开外部 SD 卡中的数据库,您必须使用此代码:

SQLiteDatabase.openDatabase(DB_PATH, null,SQLiteDatabase.OPEN_READONLY);

我希望这有帮助。


0
投票

版本 4.4 KitKat 引入了一些与 Android 如何处理存储和数据安全相关的更改。

例如,即使

isExternalStorageReadable()
返回 true,您也将无法写入外部 SD 卡,而只能写入
Environment.getExternalStorageDirectory()
返回的目录。

/* Checks if external storage is available to at least read */
public boolean isExternalStorageReadable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state) ||
        Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
        return true;
    }
    return false;
}

为了能够删除、写入、移动文件,您必须使用存储访问框架,它可以让您访问位于手机上的文件,还可以访问任何远程文件,例如 Google 云端硬盘中的文件。

要打开数据库,您必须提供路径,但文档提供程序 Api 只允许您打开输入流或移动文件,因此为了打开数据库,您必须将文件移动/复制到某个 私有内部存储 或到

Environment.getExternalStorageDirectory()
目录。

有关此主题的更多信息:

https://developer.android.com/guide/topics/providers/document-provider.html

https://stackoverflow.com/a/43317703/1502079

https://stackoverflow.com/a/21674485/1502079


0
投票

2022年的答案: 如果您在安装应用程序后复制数据库文件并看到此错误:

不是错误(代码 0):无法以读/写模式打开数据库。

只需在应用程序运行时复制数据库文件(从您的电脑)即可。

或者复制完成后通过adb shell将文件夹权限设置为777。

© www.soinside.com 2019 - 2024. All rights reserved.