通过Android中的OPEN_READWRITE访问在SD卡上打开SQLiteDatabase数据库

时间:2015-04-10 13:38:21

标签: android android-sqlite android-sdcard android-file android-external-storage

有没有办法通过OPEN_READWRITE访问权限从SD卡打开SQLiteDatabase文件?这适用于用户提供的外部数据库文件,而不是内部应用程序数据。 (编辑:处理Uri以获取实际文件路径,但硬编码为简化示例)

以下工作使用应用程序外部的内部手机存储路径:

SQLiteDatabase sqlite = SQLiteDatabase.openDatabase(
    "/storage/emulated/0/test.db",
    null,
    SQLiteDatabase.OPEN_READWRITE | SQLiteDatabase.NO_LOCALIZED_COLLATORS);

使用SD卡路径会引发异常:

SQLiteDatabase sqlite = SQLiteDatabase.openDatabase(
    "/storage/extSdCard/test.db",
    null,
    SQLiteDatabase.OPEN_READWRITE | SQLiteDatabase.NO_LOCALIZED_COLLATORS);

例外:

android.database.sqlite.SQLiteException: not an error (code 0): Could not open the database in read/write mode.

但是打开OPEN_READONLY可以正常工作:

SQLiteDatabase sqlite = SQLiteDatabase.openDatabase(
    "/storage/extSdCard/test.db",
    null,
    SQLiteDatabase.OPEN_READONLY | SQLiteDatabase.NO_LOCALIZED_COLLATORS);

清单中的外部存储权限:

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

希望Storage Access FrameworkLollipop SD API有所帮助,但没有运气。

有没有办法打开带SD卡写入权限的SQLiteDatabase文件?

1 个答案:

答案 0 :(得分:1)

可能与此有关: “与旧的4.3 Jellybean更新相比,Android 4.4 KitKat引入了很多变化。其中一个最重要的变化是它如何处理存储数据安全性。

在Android 4.4 KitKat之前,如果应用程序有权访问外部SD卡,则可以读取和写入可移动存储上的任何区域,包括DCIM,Alarms等系统文件夹。这些都已更改,并且现在,第三方应用程序,例如从Google Play或其他地方下载的应用程序,只能写入已创建或已拥有所有权的文件和文件夹。“

http://technofaq.org/posts/2014/04/fixing-external-sd-card-write-issue-on-android-kitkat/

解决方案可能是将文件复制到本地文件夹之前 - 取决于您的用例。