Realm Android Migration для изменения типа данных первичного ключа без записи данных

Я использую Realm Android и хотел изменить тип данных существующего первичного ключа с помощью Migration.

Я использовал следующий код для миграции

schema.get("Test")
      .addField("id_new", String.class)
      .removeField("id")
      .addPrimaryKey("id_new")
      .renameField("id_new", "id");

Приведенный выше код переносит схему без нарушения, но если я попытаюсь записать данные в новую схему, произойдет сбой.

Я не хочу сохранять какие-либо старые данные и, следовательно, не использовать метод преобразования.


person Rohan Peshkar    schedule 20.12.2016    source источник
comment
Что вы имеете в виду, когда вы пытаетесь записать данные в новую схему? Пример + трассировка стека этого было бы хорошо.   -  person Christian Melchior    schedule 20.12.2016
comment
определить is failing   -  person EpicPandaForce    schedule 20.12.2016
comment
Когда я пытаюсь получить данные после сохранения, они дают мне пустые результаты, а при записи данных не выдается никакого сообщения об ошибке.   -  person Rohan Peshkar    schedule 21.12.2016
comment
removeField() удаляет данные для этого свойства/поля для всех объектов типа Test.   -  person geisshirt    schedule 21.12.2016
comment
Проверьте мой ответ. Разве это не помогает вам?   -  person XIII-th    schedule 29.12.2016


Ответы (1)


Если вы не хотите сохранять данные, вы можете просто вызвать метод построителя deleteRealmIfMigrationNeeded():

RealmConfiguration config = new RealmConfiguration.Builder()
                                          .deleteRealmIfMigrationNeeded()
                                          .build();

но я думаю, это возможно ТОЛЬКО для цикла разработки приложения.

Выпущенные приложения ДОЛЖНЫ иметь реальные сценарии миграции. Для вашего вопроса я предлагаю использовать:

schema.get("Test")
  .addField("id_new", String.class, FieldAttribute.PRIMARY_KEY)
  .transform(new RealmObjectSchema.Function() {
                    @Override
                    public void apply(DynamicRealmObject obj) {
                        // yuors transformation from id to id_new
                    }
                })
  .removeField("id")
  .renameField("id_new", "id");

Смотрите также:

Официальные документы

Образец класса миграции

person XIII-th    schedule 23.12.2016