Замените базу данных SQLite внешней базой данных SQLite

Я пытаюсь заменить базу данных 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?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это обсуждается в Руководстве разработчика Codename One здесь:

Некоторые приложения SQLite поставляются с «готовой» базой данных. Мы позволяем вам заменить файл БД, используя код:

String path = Display.getInstance().getDatabasePath(“databaseName”);

Затем вы можете использовать класс FileSystemStorage для записи содержимого вашего файла БД в путь. Обратите внимание: это должен быть действительный файл SQLite!

К вопросу я добавил код, который пытался использовать для записи выбранной базы данных. Но база данных сохраняется в AppHomePath вместо каталога AppHomePath/database.

Eric 28.06.2024 12:10

Вы полагаетесь на временный путь к файлу в виде жестко закодированной строки. Это значение зависит от ОС и является случайным для каждого устройства. Пути мобильных ОС не являются предсказуемыми, как пути настольных компьютеров, и вы не можете рассчитывать на то, что они останутся согласованными.

Shai Almog 29.06.2024 06:11

Временный путь меняется. Единственная проблема заключается в том, что в симуляторе база данных сохраняется в каталоге home/.cn1, но мне нужно, чтобы она была сохранена в каталоге home/.cn1/database, где обычно создается база данных SQLite.

Eric 29.06.2024 07:42

Вы не можете переместить действующую базу данных. Вы можете создать резервную копию в другом месте, чтобы она была доступна другим приложениям. Вы можете скопировать из этого места в текущее местоположение БД. Но вы не можете открыть БД по произвольному пути к файлу.

Shai Almog 30.06.2024 03:04

Здесь много и в руководстве для разработчиков. Вам следует понимать сложность файловой системы. В Android локации меняются между версиями, и вещи, разрешенные в одной версии, больше не являются законными в другой. Это проблемный API.

Shai Almog 30.06.2024 03:06

БД не будет использоваться другими приложениями, вместо этого она будет использоваться тем же приложением на другом телефоне. Когда приложение запускается, оно создает БД, после чего у пользователя есть возможность сохранить некоторые записи в БД. Эту базу данных можно использовать совместно с помощью доступных приложений для общего доступа, таких как WhatsApp, электронная почта и т. д. После получения файла базы данных на устройстве B пользователь на устройстве B запустит приложение, которое также создаст новую базу данных. Затем пользователь Б будет использовать FileChooser для выбора общей базы данных, которая должна заменить созданную новую базу данных. После успешного завершения пользователь Б сможет просматривать/редактировать записи в БД.

Eric 30.06.2024 17:50

В симуляторе каталог хранилища приложений — home/.cn1, а каталог БД — home/.cn1/database. После выбора общей БД с помощью FileChooser мой код, приведенный выше, сохраняет БД в home/.cn1, но он мне нужен для сохранения БД в каталоге home/.cn1/database, который является каталогом базы данных по умолчанию. Как сохранить БД в home/.cn1/database?

Eric 30.06.2024 18:02

Вы можете просто использовать общий API в Display, чтобы поделиться файлом базы данных. Вам не нужен выбор файлов. Вы можете скопировать файл БД в любое произвольное место, прежде чем поделиться им. При получении файла на другом устройстве вы можете скопировать этот файл поверх существующей базы данных.

Shai Almog 01.07.2024 02:57

Пожалуйста, поделитесь примером того, как скопировать БД поверх существующей БД.

Eric 01.07.2024 06:39

Поскольку я выбираю общую БД с помощью FileChooser, в функции copyDb мне пришлось изменить InputStream i на FileSystemStorage.getInstance().openInputStream(selectedDbPa‌​th)

Eric 02.07.2024 18:55

Другие вопросы по теме