Android SqliteAssetHelper - объединение таблиц базы данных из актива с существующей

Я использую библиотеку Android SqliteAssetHelper (https://github.com/jgilfelt/android-sqlite-asset-helper) Я отправил свою базу данных с помощью этой библиотеки, и база данных содержит некоторые записи в таблице 1. Теперь я хочу обновить свое приложение новой базой данных с дополнительными записями, которые должны быть вставлены в ту, которую я уже отправил. Я не уверен, как именно написать сценарии SQL для обновления, поскольку схема одинакова для обеих баз данных. Кто-нибудь пробовал это?


person user1930106    schedule 16.05.2016    source источник
comment
Как мне обратиться к таблице моей новой БД и существующей БД - насколько я знаю, вы этого не сделаете, по крайней мере, с существующей SQLiteAssetHelper. Либо вы дублируете данные (имея их в новой версии базы данных для новых пользователей и в операторах INSERT для существующих пользователей, получающих обновление), либо применяете те же операторы INSERT для новых пользователей к исходному содержимому базы данных. Теперь SQLiteAssetHelper может предложить режим, в котором он куда-то копирует новую базу данных, и вы можете использовать ATTACH DATABASE в своем сценарии обновления для доступа к ней, но я не думаю, что это поддерживается.   -  person CommonsWare    schedule 16.05.2016
comment
Спасибо за ответ. Что-то простое, как вставка записей во время обновления, должно было поддерживаться. Просто предложение, не жалуюсь, так как я его не писал :)   -  person user1930106    schedule 16.05.2016
comment
Я также открыл тикет, чтобы проверить их ответ на него - github.com/jgilfelt/android-sqlite-asset-helper/issues/   -  person user1930106    schedule 17.05.2016


Ответы (2)


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

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

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

Затем, когда у вас есть эти 50 операторов INSERT с данными 50 новых строк, поместите операторы в сценарий обновления, и вы сможете следовать стандартной библиотеке документация о том, как заставить этот скрипт работать через эту библиотеку.

person Jon Adams    schedule 17.05.2016
comment
Не будет ли проще просто добавить записи в CSV-файл, поместить его в папку с активами, а затем прочитать в базе данных приложения? - person user1930106; 17.05.2016
comment
Возможно. Но тогда вы не получите функцию проверки версии базы данных, и вам придется проверять, когда запускать или не запускать код для импорта этого файла актива. Вам решать, какое решение, по вашему мнению, лучше подходит для вашего проекта. - person Jon Adams; 17.05.2016
comment
Я попробовал метод файла CSV, и он кажется проще. Подводя итог - изначально загруженная база данных будет скопирована с помощью SQLiteAssetHelper. Но для последующего добавления записей я буду использовать файл CSV. Если в БД есть структурные изменения, ею можно управлять с помощью SQLiteAssetHelper. Думаю, этот метод в порядке. - person user1930106; 18.05.2016

Это можно сделать, используя sqldiff, чтобы найти различия между старой и новой БД.

Вы вызываете sqldiff для двух баз данных и передаете вывод в файл, который соответствует формату обновления SQL Asset Helper (т. е. <database_name>_upgrade_<from_version>-<to_version>.sql).

Итак, все это будет sqldiff database.db database_new.db > database.db_upgrade_1-2.sql

Затем просто убедитесь, что файл .sql находится в каталоге assets/databases, и измените номера версий в вашем Java-коде (в примере с 1 на 2).

person djeastm    schedule 01.08.2017