RealmMigrationNeededException при изменении модели Realm

Всякий раз, когда я меняю модель, например добавляю дополнительные поля, происходит сбой приложения с ошибкой io.realm.exceptions.RealmMigrationNeededException. Это может быть решено только тогда, когда я удалил и переустановил приложение.

Любое предложение сделать миграцию? Я использую только экземпляр по умолчанию.


person Ralphilius    schedule 08.06.2015    source источник
comment
@EpicPandaForce Этот вопрос был задан задолго до того, как вы отметили дубликат.   -  person Ralphilius    schedule 01.10.2018
comment
Принятый ответ на другой вопрос лучше, чем этот. Технически я связал кучу вопросов вместе, основываясь на этом, независимо от даты вопроса.   -  person EpicPandaForce    schedule 01.10.2018


Ответы (3)


Вы должны быть в состоянии найти необходимую информацию здесь:

https://realm.io/docs/java/latest/#migrations

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

person Broak    schedule 08.06.2015
comment
Спасибо xBroak. Вы знаете, как мы можем этого избежать? - person Ralphilius; 08.06.2015
comment
Если вам не нужны данные в Realm, вы можете просто удалить файл Realm и открыть новый экземпляр. Это автоматически создаст новый экземпляр с правильной схемой. Если вам небезразличны данные, вам нужно написать блок миграции. Вы можете увидеть более подробную информацию в нашем примере миграции: github.com/realm/ область-java/дерево/мастер/примеры/ - person Christian Melchior; 08.06.2015
comment
Привет @kodingralph Как и Кристиан, щелкните ссылку на пример кода в разделе «Миграция Realms», который покажет вам, как инициировать миграцию для обстоятельств, точно таких же, как у вас. - person Broak; 08.06.2015
comment
Спасибо, ребята .. Я видел это раньше, но это нелегко понять без объяснений. думаю еще раз посмотрю.. - person Ralphilius; 13.06.2015

Если у вас нет проблем с потерей старых данных, вы можете удалить конфигурацию Realm и создать новую.

Realm realm = null;

                    try {
                       realm = Realm.getInstance(MainActivity.this);
                    } catch (RealmMigrationNeededException r) {
                        Realm.deleteRealmFile(MainActivity.this);
                        realm = Realm.getInstance(MainActivity.this);
                    }

OR

RealmConfiguration config2 = new RealmConfiguration.Builder(this)
                .name("default2") 
                .schemaVersion(3) 
                .deleteRealmIfMigrationNeeded() 
                .build(); 


        realm = Realm.getInstance(config2);

вам нужно сделать Migration, если вы не хотите потерять свои данные, см. этот пример здесь.

person AZ_    schedule 26.08.2015
comment
строки deleteRealmIfMigrationNeeded удаляют все мои записи всех схем - person Rajesh Nasit; 20.03.2018

Миграция областей в 0.84.2 немного изменена, ключевыми моментами при работе с миграцией областей (0.84.2) для меня было понимание того, что:

  • schemaVersion всегда равен 0, если ваше приложение имеет базу данных области без указания schemaVersion. Что верно в большинстве случаев, поскольку вы, вероятно, начнете использовать schemaVersion в конфигурации, как только вам понадобятся миграции и уже запустите действующий выпуск вашего приложения.

  • schemaVersion автоматически сохраняется, и когда происходит новая установка вашего приложения, и вы уже используете schemaVersion 3, область автоматически проверяет, есть ли исключения, если нет, она устанавливает для schemaVersion значение 3, поэтому ваши миграции не выполняются, когда они не нужны. Это также означает, что вам больше не нужно ничего хранить в SharedPreferences.

  • При миграции вы должны установить все значения новых столбцов, если тип не имеет значения NULL,...

  • Пустые строки могут быть вставлены, но только при установке convertColumnToNullable для столбца.

person Jordy    schedule 21.11.2015