Миграция Android Realm: добавление нового столбца списка Realm

Я использую Realm v0.80.1 и пытаюсь написать код миграции для нового свойства, которое я добавил. Свойство представляет собой RealmList. Я не уверен, как правильно добавить новый столбец или установить значение.

Что у меня есть: customRealmTable.addColumn(, "list");

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

customRealmTable.setRealmList(newColumnIndex, rowIndex, новый RealmList‹>());


person Steve Hernandez    schedule 28.05.2015    source источник


Ответы (2)


Вы можете увидеть пример добавления атрибута RealmList в примерах здесь: https://github.com/realm/realm-java/blob/master/examples/migrationExample/src/main/java/io/realm/examples/realmmigrationexample/model/Migration.java#L78-L78

Соответствующий код - это раздел:

   if (version == 1) {
            Table personTable = realm.getTable(Person.class);
            Table petTable = realm.getTable(Pet.class);
            petTable.addColumn(ColumnType.STRING, "name");
            petTable.addColumn(ColumnType.STRING, "type");
            long petsIndex = personTable.addColumnLink(ColumnType.LINK_LIST, "pets", petTable);
            long fullNameIndex = getIndexForProperty(personTable, "fullName");

            for (int i = 0; i < personTable.size(); i++) {
                if (personTable.getString(fullNameIndex, i).equals("JP McDonald")) {
                    personTable.getRow(i).getLinkList(petsIndex).add(petTable.add("Jimbo", "dog"));
                }
            }
            version++;
        }
person Christian Melchior    schedule 29.05.2015
comment
Этот ответ устарел; посмотрите мой ответ ниже, чтобы узнать, как это сделать с последней версией Realm. - person Vicky Chijwani; 06.10.2016
comment
Как проверить значение другого поля в RealmMigration и преобразовать новое добавленное поле на его основе. Предположим, у меня есть поле a, которое является целым числом, я хочу добавить новое поле b, которое является целым числом. В Realm Migration я должен проверить, если a == -1, то b == 0, иначе, если a == 0, то b == 1 вот так. - person Aman Verma; 01.08.2020

Начиная с Realm v1.0.0 (и, возможно, раньше) вы можете просто вызвать RealmObjectSchema#addRealmListField(String, RealmObjectSchema) (ссылка на javadoc), чтобы добиться этого. Например, если вы пытаетесь добавить поле permissions типа RealmList<Permission> в свой класс User, вы должны написать:

if (!schema.get("User").hasField("permissions")) {
    schema.get("User").addRealmListField("permissions", schema.get("Permission"));
}

В документации по миграции Realm также есть пример здесь. А вот полный javadoc для addRealmListField, для удобства:

/**
 * Adds a new field that references a {@link RealmList}.
 *
 * @param fieldName  name of the field to add.
 * @param objectSchema schema for the Realm type being referenced.
 * @return the updated schema.
 * @throws IllegalArgumentException if the field name is illegal or a field with that name already exists.
 */
person Vicky Chijwani    schedule 05.10.2016