我收到以下错误:
不是错误(代码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;
时出错答案 0 :(得分:2)
你的问题不是很清楚,但我会尽力回答。
最有可能的是,您的数据库:
对于#2,请使用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;
}
取自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
答案 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);
我希望这会有所帮助。