У меня есть база данных, основанная на SQLiteOpenHelper
, в которой есть несколько версий и код для ее обновления, и это прекрасно работает.Но в случае, если пользователь установит более старую версию приложения (которая ожидает более низкую версию базы данных), он в настоящее время завершится сбоем - ContentProvider
, использующий его, не сможет получить доступ к базе данных.Я хотел бы предотвратить его сбой, но я не хочу на самом деле понижать базу данных - добавление кода для этого было бы больно.Удаление всех таблиц, безусловно, будет работать, но начинать с нового файла будет чище и меньше подвержено ошибкам.
Вот как выглядит помощник базы данных - ничего особенного
public class MyDbHelper extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 3;
private static final String DATABASE_NAME = "my.db";
public MyDbHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
onUpgrade(db, 0, DATABASE_VERSION);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (newVersion < 1) db.execSQL("CREATE TABLE A...");
if (newVersion < 2) db.execSQL("CREATE TABLE B...");
if (newVersion < 3) db.execSQL("CREATE TABLE C...");
}
@Override
public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// I'd like to delete the database here
// the only problem is that I can't from here
// since this is called in the middle of getWritableDatabase()
// and SQLiteDatabase has no .recreate() method.
}
}
Возможные способывот для чего:
- Делаем это извне: ловим исключения в
ContentProvider
, удаляем файл и просим снова открыть базу данных.- Мне это не нравится, поскольку это не входит в обязанности провайдера. - Замена
SQLiteOpenHelper
моей собственной копией этого класса, которая удаляет файл вместо вызова onDowngrade
- Проблема в том, что он использует пакетчастные части SQLiteDatabase
(например, .lock()
), которые я не могу заменить без дублирования SQLiteDatabase
(что, вероятно, приведет к дублированию всего стека sqlite).
Есть ли что-то хорошееподход, чтобы сделать это, или я должен идти по пути DROP TABLES
, например, как описано здесь ?