Удаление всех старых таблиц и воссоздание таблиц в dbflow
Я хочу написать скрипт миграции для dbflow (v4+). Я хочу удалить все предыдущие таблицы, а затем собрать все с нуля. В настоящее время единственный способ, которым я нашел, что мы можем сделать, это как:
@Migration(version = 2, database = AppDatabase.class)
public static class Migration2 extends BaseMigration {
@Override
public void migrate(DatabaseWrapper database) {
ArrayList<ModelAdapter> modelAdapters = new ArrayList<>();
// Old tables
modelAdapters.add(FlowManager.getModelAdapter(Events.class));
modelAdapters.add(FlowManager.getModelAdapter(Notes.class));
// New table
modelAdapters.add(FlowManager.getModelAdapter(User.class));
for (ModelAdapter modelAdapter : modelAdapters) {
database.execSQL("DROP TABLE IF EXISTS " + modelAdapter.getTableName());
database.execSQL(modelAdapter.getCreationQuery());
}
}
}
Мне не нравится такой подход, поскольку мы должны вручную упомянуть все старые и новые таблицы. Есть ли лучший способ сделать это. Моя база данных значительно изменилась, и, следовательно, удаление всех таблиц, кажется, единственный вариант.
1 ответ
Вы можете использовать файл свойств и записать свои операторы отбрасывания в этом файле. Затем создайте класс, который использует приведенную ниже функцию для динамической загрузки файла и выполнения всех операторов в нем. Вы также можете использовать другой файл для динамического создания всех таблиц в вашей БД.
public void createTable() {
try {
SQLiteDatabase sqLiteDBConn = SQLLiteDBUtility.getHelper(context).getWritableDatabase();
InputStream inputStream = assetManager
.open("deletetable.properties");
Properties properties = new Properties();
properties.load(inputStream);
Enumeration<?> propertyKeys = properties.propertyNames();
while (propertyKeys.hasMoreElements()) {
String key = (String) propertyKeys.nextElement();
String strDeleteStatement = properties
.getProperty(key);
sqLiteDBConn.execSQL(strCreateStatement);
}
} catch (Exception e) {
Log.e("Exception", e.getMessage(), e);
}
}
ФАЙЛ ОБРАЗЦА СОБСТВЕННОСТИ, РАЗМЕЩЕННЫЙ В АКТИВАХ, СОДЕРЖАЩИХ СОЗДАНИЕ ТАБЛИЦЫ:
client_data.create_table = create table if not exists client_data("db_name" TEXT PRIMARY KEY NOT NULL, "db_password" TEXT DEFAULT 'F')
Для обновления базы данных вы можете создать класс, а затем расширить его до SQLiteOpenHelper, а затем ovveride метод OnUpgrade и выполнить операторы для вашей новой версии БД. Пример:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
SQLDBUpgradeUtils sqlStatementsUtil = new SQLDBUpgradeUtils ();
sqlStatementsUtil.executeStatement(db, oldVersion);
}
В SQLDBUpgradeUtils вы можете использовать что-то вроде этого:
public void executeStatement(SQLiteDatabase db, int oldVersion) {
DataLoaderUtility dataLoaderUtility = new DataLoaderUtility();
if(oldversion < PresentDBVersion){
String alterTable = "ALTER TABLE client_data ADD location TEXT"
}
}