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

时间:2016-06-02 13:31:55

标签: android android-sqlite

我收到以下错误:

  

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

我添加了

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

我正在尝试在SD卡中存在的数据库中输入数据,我能够通过&#34; OPEN_READONLY&#34;读取数据库中已存在的数据。使用&#34; OPEN_READWRITE&#34;

时出错

3 个答案:

答案 0 :(得分:2)

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

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

  1. 还不存在,你必须创建它;
  2. 您的database file is read only,您必须对其进行更改(This question可能相关)。
  3. 对于#2,请使用SQLiteOpenHelper#getReadableDatabase()

    ,而不是使用SQLiteOpenHelper#getWritableDatabase

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

    1. 目前是否安装了外置存储设备?如果没有,则无法访问数据库。
    2. 是否以只读方式安装?如果是这样,你将不得不改变它。
    3. 你检查了路径吗?这是对的吗?
    4. 问题可能出在上述任何一个主题上。

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

      /* 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;
      }
      

      取自here

      有关Environment课程的详情,请refer to the docs

答案 1 :(得分: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只允许您打开输入流或移动文件,以便打开数据库,您必须将文件移动/复制到某些 Private内部存储Environment.getExternalStorageDirectory()目录。

有关此主题的更多信息:

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

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

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

答案 2 :(得分:0)

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

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

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

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

我希望这会有所帮助。