Если вашему приложению требуется база данных и она поставляется со встроенными данными, каков наилучший способ доставки этого приложения? Нужно ли мне:
Подготовьте базу данных SQLite и включите ее в
.apk
?Включите в приложение команды SQL и создайте ли оно базу данных и вставите ли данные при первом использовании?
Недостатки, которые я вижу:
Возможные несоответствия версий SQLite могут вызвать проблемы, и я в настоящее время не знаю, где база данных должна идти и как получить к ней доступ.
Создание и заполнение базы данных на устройстве может занять очень много времени.
Какие-либо предложения? Указатели на документацию по любым вопросам будет принята с благодарностью.
android
android-sqlite
android-database
Хейкки Тойвонен
источник
источник
Ответы:
Существует два варианта создания и обновления баз.
Один из них - создать базу данных извне, затем поместить ее в папку ресурсов проекта и затем скопировать всю базу данных оттуда. Это гораздо быстрее, если в базе данных много таблиц и других компонентов. Обновления запускаются путем изменения номера версии базы данных в файле res / values / strings.xml. Обновления будут выполняться путем внешнего создания новой базы данных, замены старой базы данных в папке ресурсов новой базой данных, сохранения старой базы данных во внутреннем хранилище под другим именем, копирования новой базы данных из папки ресурсов во внутреннее хранилище и передачи всех данных. данных из старой базы данных (которая была переименована ранее) в новую базу данных и, наконец, удаление старой базы данных. Вы можете создать базу данных изначально с помощьюПлагин SQLite Manager FireFox для выполнения ваших SQL-операторов.
Другой вариант - создать базу данных из файла sql. Это не так быстро, но задержка, вероятно, будет незаметна для пользователей, если в базе данных будет всего несколько таблиц. Обновления запускаются путем изменения номера версии базы данных в файле res / values / strings.xml. Обновления будут выполняться путем обработки файла обновления sql. Данные в базе данных останутся без изменений, за исключением случаев, когда их контейнер удален, например, удалена таблица.
Пример ниже демонстрирует, как использовать любой метод.
Вот пример файла create_database.sql. Он должен быть помещен в папку ресурсов проекта для внутреннего метода или скопирован в «Выполнение SQL» SQLite Manager для создания базы данных для внешнего метода (ПРИМЕЧАНИЕ. Обратите внимание на комментарий к таблице, требуемой для Android.)
Вот пример файла update_database.sql. Он должен быть помещен в папку ресурсов проекта для внутреннего метода или скопирован в «Выполнение SQL» SQLite Manager для создания базы данных для внешнего метода. (ПРИМЕЧАНИЕ. Обратите внимание, что все три типа комментариев SQL будут игнорироваться. парсером sql, включенным в этот пример.)
Вот запись, которую нужно добавить в файл /res/values/strings.xml для номера версии базы данных.
Вот действие, которое обращается к базе данных, а затем использует ее. ( Примечание. Возможно, вы захотите запустить код базы данных в отдельном потоке, если он использует много ресурсов. )
Вот вспомогательный класс базы данных, где база данных создается или обновляется при необходимости. (ПРИМЕЧАНИЕ. Android требует создания класса, расширяющего SQLiteOpenHelper, для работы с базой данных Sqlite.)
Вот класс FileHelper, который содержит методы для копирования файлов байтового потока и анализа файлов sql.
источник
SQLiteAssetHelper
Библиотека делает эту задачу очень просто.Легко добавить как зависимость gradle (но Jar также доступен для Ant / Eclipse), и вместе с документацией его можно найти по адресу:
https://github.com/jgilfelt/android-sqlite-asset-helper
Примечание. Этот проект больше не поддерживается, как указано выше в ссылке Github.
Как объяснено в документации:
Добавьте зависимость в файл сборки gradle вашего модуля:
Скопируйте базу данных в каталог ресурсов в подкаталоге с именем
assets/databases
. Например:assets/databases/my_database.db
(При желании вы можете сжать базу данных в виде zip-файла, например
assets/databases/my_database.zip
. Это не нужно, поскольку APK уже сжат в целом.)Создайте класс, например:
источник
Мое решение не использует стороннюю библиотеку и не заставляет вас вызывать пользовательские методы в
SQLiteOpenHelper
подклассе для инициализации базы данных при создании. Он также заботится об обновлениях базы данных. Все, что нужно сделать, это создать подклассSQLiteOpenHelper
.Необходимое условие:
android_metadata
с атрибутом,locale
имеющим значениеen_US
в дополнение к таблицам, уникальным для вашего приложения.Подклассы
SQLiteOpenHelper
:SQLiteOpenHelper
.private
метод вSQLiteOpenHelper
подклассе. Этот метод содержит логику для копирования содержимого базы данных из файла базы данных в папке «assets» в базу данных, созданную в контексте пакета приложения.onCreate
,onUpgrade
иonOpen
методыSQLiteOpenHelper
.Достаточно сказано. Здесь идет
SQLiteOpenHelper
подкласс:Наконец, чтобы получить соединение с базой данных, просто вызовите
getReadableDatabase()
илиgetWritableDatabase()
наSQLiteOpenHelper
подклассе, и он позаботится о создании БД, копируя содержимое БД из указанного файла в папке «assets», если база данных не существует.Короче говоря, вы можете использовать
SQLiteOpenHelper
подкласс для доступа к базе данных, поставляемой в папке ресурсов, так же, как вы бы использовали базу данных, которая инициализируется с помощью SQL-запросов вonCreate()
методе.источник
Доставка приложения с файлом базы данных в Android Studio 3.0
Поставка приложения с файлом базы данных - хорошая идея для меня. Преимущество состоит в том, что вам не нужно выполнять сложную инициализацию, которая иногда стоит много времени, если ваш набор данных огромен.
Шаг 1: подготовить файл базы данных
Подготовьте файл базы данных. Это может быть либо файл .db, либо файл .sqlite. Если вы используете файл .sqlite, все, что вам нужно сделать, это изменить имена расширений файлов. Шаги одинаковы.
В этом примере я подготовил файл с именем testDB.db. В нем есть одна таблица и несколько примеров данных, как это
Шаг 2: Импортируйте файл в ваш проект
Создайте папку ресурсов, если у вас ее еще не было. Затем скопируйте и вставьте файл базы данных в эту папку
Шаг 3. Скопируйте файл в папку данных приложения.
Вам необходимо скопировать файл базы данных в папку данных приложения для дальнейшего взаимодействия с ним. Это однократное действие (инициализация) для копирования файла базы данных. Если вы вызываете этот код несколько раз, файл базы данных в папке данных будет перезаписан файлом базы данных. Этот процесс перезаписи полезен, когда вы хотите обновить базу данных в будущем во время обновления приложения.
Обратите внимание, что во время обновления приложения этот файл базы данных не будет изменен в папке данных приложения. Только удалить удалит его.
Файл базы данных необходимо скопировать в
/databases
папку. Откройте Обозреватель файлов устройства. Введитеdata/data/<YourAppName>/
местоположение. Это папка данных приложения по умолчанию, упомянутая выше. И по умолчанию файл базы данных будет помещен в другую папку под названием базы данных в этом каталогеТеперь процесс копирования файла во многом похож на то, что делает Java. Используйте следующий код для копирования вставки. Это код инициации. Он также может быть использован для обновления (перезаписи) файла базы данных в будущем.
Затем обновите папку, чтобы проверить процесс копирования
Шаг 4: Создать базу данных с открытым помощником
Создайте подкласс для
SQLiteOpenHelper
, с подключением, закрытием, путем и т. Д. Я назвал егоDatabaseOpenHelper
Шаг 5: Создайте класс верхнего уровня для взаимодействия с базой данных
Это будет класс, который читает и записывает файл вашей базы данных. Также есть пример запроса для распечатки значения в базе данных.
Шаг 6: Тестовый запуск
Проверьте код, выполнив следующие строки кодов.
Нажмите кнопку запуска и поболеть!
источник
В ноябре 2017 года Google выпустила Библиотеку постоянства комнат .
Из документации:
База данных Room имеет обратный вызов при первом создании или открытии базы данных. Вы можете использовать обратный вызов create для заполнения вашей базы данных.
Код из этого сообщения в блоге .
источник
Из того, что я видел, вы должны отправлять базу данных, в которой уже есть настройки таблиц и данные. Однако, если вы хотите (и в зависимости от типа вашего приложения), вы можете разрешить «опцию обновления базы данных». Затем вы загружаете последнюю версию sqlite, получаете последние инструкции вставки / создания текстового файла, размещенного в сети, выполняете инструкции и переносите данные из старой базы данных в новую.
источник
Наконец-то я это сделал !! Я использовал эту справку по ссылке Использование собственной базы данных SQLite в приложениях Android , но пришлось немного ее изменить.
Если у вас много пакетов, вы должны указать здесь имя главного пакета:
private static String DB_PATH = "data/data/masterPakageName/databases";
Я изменил метод, который копирует базу данных из локальной папки в папку эмулятора! Возникла проблема, когда этой папки не было. Поэтому, прежде всего, он должен проверить путь и, если его там нет, он должен создать папку.
В предыдущем коде
copyDatabase
метод никогда не вызывался, когда база данных не существовала иcheckDataBase
метод вызывал исключение. поэтому я немного изменил код.Если ваша база данных не имеет расширения файла, не используйте имя файла с ним.
это работает хорошо для меня, я надеюсь, что это будет полезно для вас тоже
источник
В настоящее время нет способа предварительно создать базу данных SQLite для поставки с вашим apk. Лучшее, что вы можете сделать, это сохранить соответствующий SQL как ресурс и запустить его из вашего приложения. Да, это приводит к дублированию данных (такая же информация существует как ресурс и база данных), но другого пути сейчас нет. Единственным смягчающим фактором является сжатый файл apk. Мой опыт составляет 908 КБ сжимается до менее чем 268 КБ.
В приведенной ниже ветке есть лучшее обсуждение / решение, которое я нашел с хорошим примером кода.
http://groups.google.com/group/android-developers/msg/9f455ae93a1cf152
Я сохранил свой оператор CREATE как строковый ресурс для чтения с помощью Context.getString () и запустил его с помощью SQLiteDatabse.execSQL ().
Я сохранил данные для моих вставок в res / raw / insertts.sql (я создал файл sql, более 7000 строк). Используя технику, приведенную выше, я зашел в цикл, построчно прочитал файл, соединил данные в «INSERT INTO tbl VALUE» и сделал еще один SQLiteDatabase.execSQL (). Нет смысла сохранять 7000 «INSERT INTO tbl VALUE», когда их можно только конкатенировать.
На эмуляторе это занимает около двадцати секунд, я не знаю, сколько времени это займет на реальном телефоне, но это происходит только один раз, когда пользователь впервые запускает приложение.
источник
INSERT INTO table VALUES(...) VALUES(...) VALUES(...) ...
(1 строка вставки должна иметь 100 ЗНАЧЕНИЙ). Это будет намного эффективнее и сократит время запуска с 20 секунд до 2 или 3 секунд.Доставка базы данных внутри apk с последующим копированием в нее
/data/data/...
удвоит размер базы данных (1 в apk, 1 indata/data/...
) и увеличит размер apk (конечно). Так что ваша база данных не должна быть слишком большой.источник
В Android уже реализован подход к управлению базами данных с учетом версий. Этот подход был использован в среде BARACUS для приложений Android.
Он позволяет вам управлять базой данных на протяжении всего жизненного цикла версии приложения, имея возможность обновлять базу данных sqlite с любой предыдущей версии до текущей.
Кроме того, он позволяет запускать горячее резервное копирование и горячее восстановление SQLite.
Я не уверен на 100%, но горячее восстановление для конкретного устройства может позволить вам добавить готовую базу данных в ваше приложение. Но я не уверен насчет двоичного формата базы данных, который может быть специфичным для определенных устройств, поставщиков или поколений устройств.
Поскольку это Apache License 2, вы можете использовать любую часть кода, которую можно найти на github.
РЕДАКТИРОВАТЬ :
Если вы хотите только отправлять данные, вы можете рассмотреть возможность создания и сохранения POJO при первом запуске приложений. BARACUS получил встроенную поддержку для этого (встроенное хранилище значений ключей для информации о конфигурации, например, «APP_FIRST_RUN» плюс ловушка после-context-bootstrap для запуска операций после запуска в контексте). Это позволяет вам получать тесно связанные данные с вашим приложением; в большинстве случаев это подходит для моих случаев использования.
источник
Если требуемые данные не слишком велики (ограничения, которые я не знаю, будут зависеть от многих вещей), вы также можете загрузить данные (в формате XML, JSON и т. Д.) С веб-сайта / веб-приложения. После получения выполните операторы SQL, используя полученные данные, создавая таблицы и вставляя данные.
Если ваше мобильное приложение содержит много данных, позже может быть проще обновить данные в установленных приложениях более точными данными или изменениями.
источник
Я изменил класс и ответы на вопрос и написал класс, который позволяет обновлять базу данных через DB_VERSION.
Используя класс.
В классе деятельности объявите переменные.
В методе onCreate напишите следующий код.
Если вы добавите файл базы данных в папку res / raw, используйте следующую модификацию класса.
http://blog.harrix.org/article/6784
источник
Я написал библиотеку, чтобы упростить этот процесс.
Это создаст базу данных из
assets/databases/myDb.db
файла. Кроме того, вы получите все эти функции:Клонируй это из github .
источник
Я использую ORMLite и ниже код работал для меня
Обратите внимание, код извлекает файл базы данных из zip-файла в ресурсах
источник