Проблема миграции области Android → java.lang.IllegalArgumentException: поле первичного ключа «foo» не может быть изменено после создания объекта

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

java.lang.IllegalArgumentException: Primary key field 'foo' cannot be changed after object was created.

Ниже приведен мой существующий код.

schema.get("FooEntity")
        .transform(entity -> {
                final String fieldValue = entity.getString("foo");
                entity.setString("foo", fieldValue.toUpperCase(Locale.US));
        });

Мой подход к решению проблемы миграции заключается в следующем: сначала удалите первичный ключ; затем преобразовать значение поля; и, наконец, повторно добавьте первичный ключ.

schema.get("FooEntity")
    .removePrimaryKey()
    .transform(entity -> {
            final String fieldValue = entity.getString("foo");
            entity.setString("foo", fieldValue.toUpperCase(Locale.US));
    })
    .addPrimaryKey("foo");

Кажется, это работает так, как ожидалось.

Есть ли проблемы, связанные с этим подходом?


person Steve Yohanan    schedule 08.01.2019    source источник
comment
afaik, вы не можете каким-либо образом редактировать первичные ключи в области, не удаляя объект и не добавляя его повторно. одной из проблем может быть то, что обновление будет отображаться как удаление в любых подключенных слушателях. однако это проблема только в производственной БД, где вы не можете позволить себе удаление таких данных.   -  person kkarakk    schedule 08.01.2019
comment
См. этот ответ. Я думаю, что это ответит на ваш вопрос.   -  person Pratik Kulkarni    schedule 08.01.2019
comment
@KaranHarshWardhan, во-первых, этот подход, похоже, работает - исключение больше не выдается. во-вторых, это миграция при запуске приложения, поэтому слушателей нет.   -  person Steve Yohanan    schedule 08.01.2019
comment
@PratikKulkarni да, я видел этот ответ. это обычно то, что я бы планировал в качестве альтернативы; тем не менее, подход, который я представил, кажется, работает, поэтому мне было любопытно, видел ли кто-нибудь какие-либо недостатки в этом, поскольку он, возможно, более прост.   -  person Steve Yohanan    schedule 08.01.2019