Обновление первичного ключа при миграции Realm

У меня есть несколько случаев, когда мне нужно обновить некоторые объектные модели, включая свойство, которое я использую в качестве первичного ключа.

Например :

  • Объедините первичный ключ name (например, Georges, Anna...) и свойство familyName (например, Johnson, Smith...) и используйте этот новый объединенный name < em>(например, Georges Johnson...) в качестве первичного ключа.
  • Превратите первичный ключ identifier из типа Int в тип String.

Но, конечно, в документации четко указано, что:

Как только объект с первичным ключом добавлен в Realm, первичный ключ нельзя изменить.

Вы всегда можете удалить старые объекты и создать новые, но это усложнит повторное создание отношений.

И я почти уверен, что царство может быть недовольно изменением типа identifier в любом случае (судя по выброшенным исключениям, с которыми я столкнулся).

Поэтому мне было интересно, есть ли более простой способ сделать это, или мне пришлось проделать много ручной работы, чтобы достичь моих очень простых целей.


person Yoam Farges    schedule 09.06.2017    source источник
comment
Есть гораздо более простой способ. Не используйте поля, которые могут измениться, в качестве первичного ключа. Либо создайте уникальный идентификатор, либо позвольте Realm сделать это за вас.   -  person Mozahler    schedule 09.06.2017


Ответы (1)


Катсуми из Realm здесь. Realm поддерживает миграцию первичного ключа. Первичные ключи можно изменить только во время миграции. Итак, вы хотите изменить существующие значения первичного ключа, вы можете написать блок миграции, а затем назначить новые значения для каждого нового объекта. Конечно, значения должны быть уникальными.

let config = Realm.Configuration(schemaVersion: 1, migrationBlock: { (migration, schemaVersion) in
    migration.enumerateObjects(ofType: "Person", { (oldObject, newObject) in
        newObject!["key"] = ...
    })
})

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

Однако последняя версия Realm (2.8.0 и 2.8.1) допустила непреднамеренную ошибку, которая не позволяет изменить первичный ключ даже во время миграции. Поэтому, если вам срочно, вы должны использовать предыдущую версию (2.7.x), если вам не срочно, подождите, пока ошибка не будет исправлена ​​в следующем выпуске.

person kishikawa katsumi    schedule 13.06.2017
comment
Так что моя проблема на самом деле была вызвана версией Realm... Вот почему я был действительно сбит с толку. Большое спасибо за вашу хорошую работу и вашу поддержку, я постараюсь понизить версию и посмотреть, как это пойдет. - person Yoam Farges; 14.06.2017
comment
Я понизил версию до 2.7.0, и теперь все работает как положено. - person Yoam Farges; 14.06.2017