Доступ на запись для базы данных SQLite на SDCard - PullRequest
0 голосов
/ 17 октября 2019

У меня есть база данных SQLite на моей SD-карте (/storage/sdcard/MyDir/mydb.sqlite) и я пытаюсь записать в нее некоторые данные. Из-за структуры доступа к хранилищу я не могу получить доступ к файлу напрямую, и мне нужно получить доступ на запись, как описано здесь . Это дает мне доступ на запись через DocumentFile .

Однако к базе данных требуется доступ через JDBC . JDBC требует String для файла базы данных, чтобы установить соединение с базой данных. Это приводит к следующим проблемам:

  • Если я использую Java-путь, я могу получить доступ к базе данных, но у меня нет разрешения на запись. Даже если доступ был предоставлен, как описано выше.
  • Если я использую Uri из DocumentFile (с разрешением на запись) JDBC не делаетнайдите файл базы данных.

Я могу поместить свою базу данных в личный каталог приложения на SDCard (/storage/sdcard/Android/data/my.application.package/), где я пишуразрешение. Тем не менее, я хотел бы хранить базу данных вне этого каталога, так как база данных должна быть доступна нескольким приложениям.

Я попробовал это предложение, которое работает на устройстве хранения данных, но не работает на SDCard. На SDCard я получаю эту трассировку стека:

 android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 1294 SQLITE_CANTOPEN_ENOENT[1294]): Could not open database
    at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
    at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:284)
    at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:215)
    at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:705)
    at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:272)
    at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:239)
    at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:1292)
    at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:1247)
    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:930)
    at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:947)

Когда я получаю доступ к базе данных на устройстве хранения (внутреннее хранилище и внешнее хранилище), я могу записать базу данных. Только если я получаю доступ к базе данных на SD-карте, у меня нет разрешения на запись.

Есть ли возможность получить доступ на запись к определенным файлам на SD-карте на основе java.io.File , как этовозможно для DocumentFile ?

Кто-нибудь имеет другое представление, как я могу получить доступ к данным на SD-карте с разрешением на запись?

1 Ответ

1 голос
/ 17 октября 2019

У меня есть база данных SQLite на моей SD-карте (/storage/sdcard/MyDir/mydb.sqlite)

Использование съемного хранилища в качестве места передачи для базы данных SQLite - это нормально. Например, можно использовать съемное хранилище для операций резервного копирования и восстановления.

Однако для базы данных live съемное хранилище очень рискованно. На многих устройствах съемное хранилище является съемным, и вы будете страдать от катастрофических проблем, если пользователь удалит хранилище, когда вы пытаетесь выполнить запись в базу данных.

И, как вы обнаруживаете, использование съемного хранилища для оперативногоданные непрактичны.

база данных должна быть доступна через JDBC

Android имеет встроенный API базы данных SQLite. Попытка использовать недоделанные классы JDBC для Android для доступа к базе данных SQLite очень странна.

Когда я получаю доступ к базе данных в хранилище устройства (внутреннее и внешнее хранилище), я могу записать базу данных

Вы столкнетесь с проблемами на Android 10 и выше, так как у вас больше нет прямого доступа файловой системы к большей части внешнего хранилища .

Есть ли возможностьполучить доступ на запись к определенным файлам на SD-карте на основе java.io.File, как это возможно для DocumentFile?

Нет, извините. У вас нет доступа файловой системы к произвольным местам на съемном носителе начиная с Android 4.4 . Android 10 распространяется на произвольные места на внешнем хранилище. Либо:

  • Ограничьте себя каталогами, к которым вы можете получить доступ, либо

  • Используйте съемное хранилище только для операций резервного копирования / восстановления с оперативнымбаза данных в более обычном месте (getDatabasePath() на Context)

...