Я пытаюсь заменить базу данных SQLite внешней базой данных SQLite, которая выбрана с помощью FileChooser.
Цель — сделать базу данных доступной для разных устройств. То есть, когда в базу данных на устройстве А вносятся изменения, эту базу данных можно использовать на другом устройстве Б.
Как можно заменить базу данных SQLite, созданную в папке AppHomePath/database, на базу данных, выбранную с помощью FileChooser
РЕДАКТИРОВАТЬ
В симуляторе следующий фрагмент сохраняет выбранную базу данных в AppHomePath вместо AppHomePath/database.
String selectedDbPath = "file:///tmp/temp11455781152272037918.db";
Util.copy(FileSystemStorage.getInstance().openInputStream(selectedDbPath),
Storage.getInstance().createOutputStream("DbName.db"));
selectedDbPath — путь, возвращаемый FileChooser
Как сохранить DbName.db в каталоге AppHomePath/database?





Это обсуждается в Руководстве разработчика Codename One здесь:
Некоторые приложения SQLite поставляются с «готовой» базой данных. Мы позволяем вам заменить файл БД, используя код:
String path = Display.getInstance().getDatabasePath(“databaseName”);Затем вы можете использовать класс FileSystemStorage для записи содержимого вашего файла БД в путь. Обратите внимание: это должен быть действительный файл SQLite!
Вы полагаетесь на временный путь к файлу в виде жестко закодированной строки. Это значение зависит от ОС и является случайным для каждого устройства. Пути мобильных ОС не являются предсказуемыми, как пути настольных компьютеров, и вы не можете рассчитывать на то, что они останутся согласованными.
Временный путь меняется. Единственная проблема заключается в том, что в симуляторе база данных сохраняется в каталоге home/.cn1, но мне нужно, чтобы она была сохранена в каталоге home/.cn1/database, где обычно создается база данных SQLite.
Вы не можете переместить действующую базу данных. Вы можете создать резервную копию в другом месте, чтобы она была доступна другим приложениям. Вы можете скопировать из этого места в текущее местоположение БД. Но вы не можете открыть БД по произвольному пути к файлу.
Здесь много и в руководстве для разработчиков. Вам следует понимать сложность файловой системы. В Android локации меняются между версиями, и вещи, разрешенные в одной версии, больше не являются законными в другой. Это проблемный API.
БД не будет использоваться другими приложениями, вместо этого она будет использоваться тем же приложением на другом телефоне. Когда приложение запускается, оно создает БД, после чего у пользователя есть возможность сохранить некоторые записи в БД. Эту базу данных можно использовать совместно с помощью доступных приложений для общего доступа, таких как WhatsApp, электронная почта и т. д. После получения файла базы данных на устройстве B пользователь на устройстве B запустит приложение, которое также создаст новую базу данных. Затем пользователь Б будет использовать FileChooser для выбора общей базы данных, которая должна заменить созданную новую базу данных. После успешного завершения пользователь Б сможет просматривать/редактировать записи в БД.
В симуляторе каталог хранилища приложений — home/.cn1, а каталог БД — home/.cn1/database. После выбора общей БД с помощью FileChooser мой код, приведенный выше, сохраняет БД в home/.cn1, но он мне нужен для сохранения БД в каталоге home/.cn1/database, который является каталогом базы данных по умолчанию. Как сохранить БД в home/.cn1/database?
Вы можете просто использовать общий API в Display, чтобы поделиться файлом базы данных. Вам не нужен выбор файлов. Вы можете скопировать файл БД в любое произвольное место, прежде чем поделиться им. При получении файла на другом устройстве вы можете скопировать этот файл поверх существующей базы данных.
Пожалуйста, поделитесь примером того, как скопировать БД поверх существующей БД.
Поскольку я выбираю общую БД с помощью FileChooser, в функции copyDb мне пришлось изменить InputStream i на FileSystemStorage.getInstance().openInputStream(selectedDbPath)
К вопросу я добавил код, который пытался использовать для записи выбранной базы данных. Но база данных сохраняется в AppHomePath вместо каталога AppHomePath/database.