RealmMigrationNeededException: требуется миграция Realm при добавлении новой таблицы в существующую базу данных, Android

Я использую Realm Gradle версии «3.0.0», у меня есть две таблицы «Word» и «Favourite», как показано ниже.

введите здесь описание изображения

Теперь я хочу добавить третью таблицу с именем «История».

для этого я сделал код ниже

@Override
    public void migrate(DynamicRealm realm, long oldVersion, long newVersion) {
        final RealmSchema schema = realm.getSchema();

        if (oldVersion == 0) {
            RealmObjectSchema wordSchema = schema.get("Word");
            wordSchema.addField(DBHelper.COLUMN_NAME_PRONOUCE, String.class);
            wordSchema.addField(DBHelper.COLUMN_NAME_TYPE, String.class);
            oldVersion++;
        } if(oldVersion == 1){
            RealmObjectSchema favouriteSchema = schema.get("Favourite");
            favouriteSchema.addField(DBHelper.COLUMN_NAME_ID, String.class);
            favouriteSchema.addField(DBHelper.COLUMN_NAME_WORD, String.class);
            favouriteSchema.addField(DBHelper.COLUMN_NAME_OBJECT_ID, String.class);
            favouriteSchema.addField(DBHelper.COLUMN_NAME_PRONOUCE, String.class);
            favouriteSchema.addField(DBHelper.COLUMN_NAME_TYPE, String.class);
            favouriteSchema.addField(DBHelper.COLUMN_NAME_MEANING, String.class);
            oldVersion++;
        }
         if(oldVersion == 2){
                schema.create("History")
                .addField(DBHelper.COLUMN_NAME_ID, String.class)
                .addField(DBHelper.COLUMN_NAME_WORD, String.class)
                .addField(DBHelper.COLUMN_NAME_OBJECT_ID, String.class)
                .addField(DBHelper.COLUMN_NAME_PRONOUCE, String.class)
                .addField(DBHelper.COLUMN_NAME_TYPE, String.class)
                .addField(DBHelper.COLUMN_NAME_MEANING, String.class);
                oldVersion++;
            }
    }

Но я получаю ошибку ниже,

io.realm.exceptions.RealmMigrationNeededException: Migration is required due to the following errors:
    - Property 'History.id' has been changed from 'string' to 'int'.
    - Property 'History.word' has been made required.
    - Property 'History.objectId' has been made required.
    - Property 'History.pronunciation' has been made required.
    - Property 'History.type' has been made required.
    - Property 'History.meaning' has been made required.

Я раньше не создавал таблицы истории, почему тогда написано, что History.id был изменен с «string» на «int»?

Как правильно добавить таблицу истории?


person Panchal Amit    schedule 08.09.2018    source источник


Ответы (1)


     if(oldVersion == 2){
            schema.create("History")
            .addField(DBHelper.COLUMN_NAME_ID, int.class)
            .addField(DBHelper.COLUMN_NAME_WORD, String.class, FieldAttribute.REQUIRED)
            .addField(DBHelper.COLUMN_NAME_OBJECT_ID, String.class, FieldAttribute.REQUIRED)
            .addField(DBHelper.COLUMN_NAME_PRONOUCE, String.class, FieldAttribute.REQUIRED)
            .addField(DBHelper.COLUMN_NAME_TYPE, String.class, FieldAttribute.REQUIRED)
            .addField(DBHelper.COLUMN_NAME_MEANING, String.class, FieldAttribute.REQUIRED);
            oldVersion++;
        }

На тестовом телефоне просто удалите/переустановите приложение после этого, иначе вам нужно будет изменить версию схемы и изменить поля на правильный тип.

person EpicPandaForce    schedule 08.09.2018
comment
Технически я могу написать требуемую миграцию для oldVersion == 3, если она такая запутанная, но это сложнее, потому что вам нужно изменить тип PK. - person EpicPandaForce; 08.09.2018
comment
Большое спасибо, вы сэкономили мне много времени - person Panchal Amit; 10.09.2018
comment
В документе также я не могу найти правильную информацию об этой добавленной новой таблице. - person Panchal Amit; 10.09.2018
comment
У них это есть в их примеры - person EpicPandaForce; 10.09.2018