Как создать базу данных SQLite на USB-накопителе?

Я хочу создать файл базы данных SQL на устройстве USB (otg). Проблема в том, что на более новых устройствах я получаю доступ к USB с помощью SAF, поэтому больше нет реального пути к файлу или обработки.

Всем методам android sqlite openOrCreateDatabase требуется файл или путь, который больше невозможен с SAF/DocumentFile.

Другие варианты, о которых я думал, используя альтернативы sqlite, но, похоже, Realm тоже не поддерживает это?

Любые другие идеи? Итак, я предполагаю, что sqlite API скоро будет обновлен для поддержки DocumentFile или Uri?

Чтобы было ясно, что приложение работает с большими данными на USB-накопителе, приложению также требуется db для хранения некоторой информации на USB-накопителе. Конечно, я всегда могу создать на устройстве, а затем скопировать на USB, но если процесс остановится посередине, данные будут потеряны?


person user4521550    schedule 22.05.2019    source источник
comment
Попробуйте использовать https://sqlitebrowser.org/ для создания базы данных SQlite, а затем вам нужно написать отдельный код в программе, которая обнаружит USB и найдет ссылку Sqlite Db Connecting. и эта ссылка будет затем передана в dbconnection.   -  person Sayed Muhammad Idrees    schedule 22.05.2019
comment
Возможный дубликат Как SAF (инфраструктура доступа к хранилищу) распознает ваш USB-накопитель?   -  person Martin Zeitler    schedule 22.05.2019
comment
кроме того, в системе Linux все, что было смонтировано, имеет путь.   -  person Martin Zeitler    schedule 22.05.2019
comment
@Sayedidrees Извините, какое отношение sqlitebrowser.org имеет к заданному мной вопросу? Не могли бы вы объяснить?   -  person user4521550    schedule 22.05.2019
comment
@MartinZeitler, это не дубликат. Я знаю, что файл находится на USB, и это неправда, используя SAF, файла больше нет.   -  person user4521550    schedule 22.05.2019


Ответы (1)


Вы не можете хранить базы данных SQLite с помощью SAF, потому что SQLite не поддерживает открытие баз данных на (SAF) Uris и, вероятно, никогда не будет по объясненным причинам. в связанном ответе.

Вам необходимо создать базу данных в доступном месте, выполнить любые операции чтения/записи, а затем скопировать базу данных на USB-накопитель. Во избежание потери данных не перезаписывайте целевой файл (если он существует), а вместо этого используйте временный файл и переименовывайте его только после успешного завершения операции.


Если вы посмотрите на все доступные методы доступа к хранилищу, единственный другой вариант — Context#getExternalFilesDirs который не должен работать, потому что...

Возвращаемые пути не включают временные устройства, такие как флэш-накопители USB, подключенные к портативным устройствам.

Однако для устройств, которые я тестировал, это не похоже на правду, например. вы действительно можете получить доступ к USB-устройствам, используя getExternalFilesDirs(). Например. если у вас есть том uuid 00A1-CC00, вы можете получить доступ к SAF Uri content://com.android.externalstorage.documents/tree/00A1-CC00%3A/document/00A1-CC00%3AAndroid%2Fdata%2Fcom.example%2Ffiles как /storage/00A1-CC00/Android/data/com.example/files.


Если вам абсолютно необходимо выполнять операции с базой данных без временного внутреннего файла, вы можете использовать базу данных h2 в памяти. Для этого потребуется модифицированный BACKUP TO, чтобы разрешить запись в SAF OutputStream.

person x0b    schedule 05.09.2019