4

Есть ли способ открыть файл SQLiteDatabase с SD-карты с доступом OPEN_READWRITE? Это для внешних файлов базы данных, предоставленных пользователем, а не для внутренних данных приложения. (Edit: Обращение Ури, чтобы получить реальные пути к файлам, но жёстко на упрощенном примере)Открыть базу данных SQLiteDatabase на SD-карте с доступом OPEN_READWRITE в Android

Следующие работы, используя путь к внутренней памяти телефона, внешние к приложению:

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 Framework или Lollipop SD API может помочь, но я, не имея каких-либо удачи.

Есть ли способ открыть файл SQLiteDatabase с возможностью записи с SD-карты?

+0

Используйте 'Environment.getExternalStorageDirectory()' для доступа к хранилищу, а не по фиксированному пути. Точка монтирования SDcard может отличаться от устройства к устройству. –

+0

Я обрабатываю файлы Uri отдельно для файлов. Просто упрощено в вопросе, чтобы изолировать проблему. –

+0

Может ли это быть источником вашей проблемы: http://technofaq.org/posts/2014/04/fixing-external-sd-card-write-issue-on-android-kitkat/ – Raanan

ответ

1

Может быть связано с этим: «Android 4.4 KitKat принес много изменений по сравнению с его старшим 4.3 Jellybean обновления и один из самых значительных изменений в том, как он обрабатывает безопасность данных для хранения

До.. Android 4.4 KitKat, при условии, что у них есть разрешение на доступ к внешней SD-карте, может читать и записывать в любую область на съемном носителе, включая системные папки, такие как DCIM, Alarms и т. Д. Это все изменилось, а теперь сторонние приложения , так как в тех, которые вы загружаете из Google Play или где-либо еще, можно записывать только файлы и папки, которые они создали или получили право собственности ».

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

Решение может быть скопировать файл в локальную папку до - зависит от вашего USECASE.

+0

Спасибо за ссылку. 4.4 все усложняло. Коррекция телефона не вариант. Было надеяться, что это возможно на Lollipop по крайней мере. Я поддерживаю записываемые базы данных в памяти приложения, а также внешние данные в памяти телефона. Также позволяет пользователю импортировать копию с SD-карты, которая затем может быть отредактирована. Они также могут получить доступ для чтения непосредственно с SD-карты. Для нескольких больших баз данных было бы полезно использовать прямой доступ к базам данных на SD-карте. –