Обновление sqlite базы данных в андроид-приложении из assets

Интересная задача: как обновить базу данных приложения, если мы ее используем в качестве источника данных и не храним никаких пользовательских данных? Сходу можно предложить вариант использовать текстовый дамп таблицы или при поставке обновления приложения полностью перезаписывать данные в приложении на новые. Рассмотрим второй вариант в применении к SQLite базе данных.

UPD. Подход прикольный, но в использовать не рекомендую, при каждом обращении к базе данных перекопируется файл из ассетса. Причина в том, что при моем подходе почему-то после отработки функции onCreate движок не считал базу данных созданной. Сейчас в поиске оптимального решения.

Для удобства работы с базой данных в adnroid используется наследование от класса SQLiteOpenHelper. Как говорит нам документация на класс он предназначен для управления созданием базы данных и управление версиями этой базы. При создании дочернего класса, необходимо реализовать методы onCreate(SQLiteDatabase), onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) и по желанию onOpen(SQLiteDatabase). Так же этот класс будет заботиться об открытии базы данных если она существует, создании, если не существует и обновлении, по необходимости. В том числе класс использует транзакции для того, чтобы всегда держать базу данных в доступном состоянии.
Таким образом стандартный путь предлагает нам использовать sql скрипты для изменения базы данных, которые мы зашиваем в тело методов. Нас же интересует способ, при котором мы можем использовать файл базы данных SQLite, поставляемый с приложением.
В поставке приложения сам файл базы данных удобнее всего поместить в папку assets приложения. Для примера предположим, что наш файл имеет название «mydb.sqlite3», то его мы можем получить следующим образом:

В итоге мы получим InputStream нашего файла.

Затем мы просто в нужное место записываем данные из файла:

В принципе, мы могли бы этот код поместить в методы onCreate и onUpdate, если бы не транзакционность операции в классе SQLiteOpenHelper. Если мы попробуем перезаписывать файл внутри этих методов, то мы в итоге получим «битый» файл базы данных. Значит мы должны самостоятельно отслеживать событие на создание/изменение базы данных (а это случится в случае если мы производим установку/обновление приложения). В итоге код, который отвечает за управление базой данных:

И в основном коде мы используем таким образом: