我收到以下错误:
不是错误(代码 0):无法以读/写模式打开数据库。
我已经添加了
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
我正在尝试在 SD 卡中存在的数据库中输入数据,我可以通过“OPEN_READONLY”读取数据库中已存在的数据。我在使用“OPEN_READWRITE”时遇到错误
你的问题不太清楚,但我会尽力回答。
最有可能的是,您的数据库:
SQLiteOpenHelper#getReadableDatabase()
,而是使用 SQLiteOpenHelper#getWritableDatabase
如果您的数据库位于外部存储单元上,则还需要检查其他一些事项:
问题可能出在这些主题中的任何一个上。
要检查它是否以只读方式安装,请尝试以下操作:
/* 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
课程的更多信息,请参阅文档。
在 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);
我希望这有帮助。
版本 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
2022年的答案: 如果您在安装应用程序后复制数据库文件并看到此错误:
不是错误(代码 0):无法以读/写模式打开数据库。
只需在应用程序运行时复制数据库文件(从您的电脑)即可。
或者复制完成后通过adb shell将文件夹权限设置为777。