Удаление всех старых таблиц и воссоздание таблиц в 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"
}
        }
Другие вопросы по тегам