Как сохранить табличные значения после изменения версии базы данных? - PullRequest
0 голосов
/ 03 октября 2018

Я использую библиотеку greendao для операций с базой данных.У меня есть некоторые сомнения,

  1. В настоящее время, когда я добавляю любой entity в один из database table, я должен обновить свою версию базы данных до следующей.Если я не обновляю приложение версии, по какой-то причине происходит сбой. Действительно ли необходимо обновлять версию базы данных каждый раз, когда я добавляю или обновляю сущности таблицы?
  2. Однако, когда я обновляю версию базы данных , все значения базы данных очищаются. Как сохранить значения базы данных неизменными после обновления версии базы данных?

Пожалуйста, помогите с этим

Заранее спасибо

1 Ответ

0 голосов
/ 03 октября 2018

Вы должны написать миграцию, чтобы предотвратить стирание данных.

Вот пример кода, как это выглядит:

public class DatabaseUpgradeHelper extends DaoMaster.OpenHelper {
    public DatabaseUpgradeHelper(Context context, String name) {
        super(context, name);
    }
    @Override
    public void onUpgrade(Database db, int oldVersion, int newVersion) {
        List<Migration> migrations = getMigrations();
        // Only run migrations past the old version
        for (Migration migration : migrations) {
            if (oldVersion < migration.getVersion()) {
                migration.runMigration(db);
            }
        }
    }
    private List<Migration> getMigrations() {
        List<Migration> migrations = new ArrayList<>();
        migrations.add(new MigrationV2());
        migrations.add(new MigrationV3());
        // Sorting just to be safe, in case other people add migrations in the wrong order.
        Comparator<Migration> migrationComparator = new Comparator<Migration>() {
            @Override
            public int compare(Migration m1, Migration m2) {
                return m1.getVersion().compareTo(m2.getVersion());
            }
        };
        Collections.sort(migrations, migrationComparator);
        return migrations;
    }
    private static class MigrationV2 implements Migration {
        @Override
        public Integer getVersion() {
            return 2;
        }
        @Override
        public void runMigration(Database db) {
            //Adding new table
            UserDao.createTable(db, false);
        }
    }
    private static class MigrationV3 implements Migration {
        @Override
        public Integer getVersion() {
            return 3;
        }
        @Override
        public void runMigration(Database db) {
            // Add new column to user table
            db.execSQL("ALTER TABLE " + UserDao.TABLENAME + " ADD COLUMN " + UserDao.Properties.Age.columnName + " INTEGER");
        }
    }
    private interface Migration {
        Integer getVersion();
        void runMigration(Database db);
    }
}
...