WedX - журнал о программировании и компьютерных науках

Как обрабатывать миграции Realm React Native и schemaVersion на iOS?

Прежде чем я влюблюсь в realm для React Native и iOS, я пытаюсь узнать больше о том, как я могу обрабатывать миграции. Это заявление меня насторожило:

React Native 0.10.0

Миграции в настоящее время ограничены обновлением схемы и версии схемы при открытии Realm, как описано выше. Миграция данных пока не поддерживается, но может быть добавлена ​​в будущем.

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

Как я могу указать несколько схем, каждая со своими собственными версиями схемы?

Это не работает:

export default new Realm(
  {schema: [AppSetting], schemaVersion: 0},
  {schema: [Gps], schemaVersion: 3},
  {schema: [Waypoint], schemaVersion: 4},
  {schema: [FlightPath], schemaVersion: 1},
);

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

Будет ли миграция простой, пока я добавляю только новые свойства?

Я предполагаю, что не могу переименовать или удалить существующие свойства?

Советы по миграции областей очень ценятся,


Ответы:


1

Вам нужно указать одну schemaVersion для всей схемы:

export default new Realm({schema: [AppSetting, Gps, ...], schemaVersion: 0});

Когда вы обновляете любую из objectSchema в своей схеме, вам нужно увеличить вашу schemaVersion. Это означает, что некоторые отдельные objectSchema останутся одинаковыми для нескольких schemaVersion, но я думаю, что это менее сложно, чем иметь разные версии для каждого типа объекта.

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

У нас не было времени завершить миграцию для первоначального выпуска, но хорошая новость заключается в том, что большая часть функций реализована внутри, и их просто нужно открыть через js API. Как все будет работать, вы сможете передать функцию миграции при открытии области, которая даст вам доступ как к области до, так и после миграции, что позволит вам копировать данные по мере необходимости. Мы надеемся, что это будет завершено в одном из следующих нескольких выпусков.

15.03.2016
  • @Ari Как старое и новое могут существовать одновременно, чтобы я мог копировать данные в новый формат? Предположим, я переименовал свойство и мне нужно скопировать старое в новое, как мне это сделать? Когда я запускаю в первый раз с новой schemaVersion, будет ли старое имя свойства удалено прежде чем я получу возможность скопировать свойство с новым именем? 31.03.2016
  • @ Эд. На данный момент вам нужно иметь версию схемы, в которой оба свойства существуют одновременно, поэтому вместо переименования вам нужно обновить формат с обоими свойствами, в это время вы можете сделать копию, а затем в следующем изменении схемы вы может удалить старое свойство. Это явно неудобно, и мы работаем над надлежащей поддержкой миграции данных, включая в какой-то момент автоматическую поддержку переименования свойств. 01.04.2016
  • 1) Создайте новую схему, 2) Создайте схему однократного запуска, которая сочетает в себе старую схему и новую схему, 3) Разверните как однократную, так и новую схему с новым выпуском, 4) Мигрируйте вручную, используя однократную схему, 5) Закройте запустить однократную схему, а затем загрузить новую схему. Это то, как будет выглядеть обходной путь? 01.04.2016
  • @Ari Я ожидал, что при добавлении новых свойств не потребуется перенос. Разве это не правильно? Все поля schemaVersion объекта были установлены на 0 и увеличены до 1 для новой schemaVersion. Я получаю сообщение об ошибке в виде красного квадрата с сообщением Требуется миграция из-за новых свойств, которые я добавил в объектные модели? Я что-то упускаю? 03.05.2016
  • Неважно, если не указывать schemaVersion, по умолчанию используется значение 0. При добавлении только новых свойств указание версии схемы работало без необходимости миграции. export default new Realm({ schema: [ AppSetting, Waypoint, Boreplan, ], schemaVersion: 1 }); 03.05.2016
  • Просто хотел сообщить вам, что последняя версия Realm поддерживает миграцию данных, поэтому вы можете переименовывать свойства одним изменением схемы и копировать значения свойств в функции миграции. realm.io/docs/react-native/latest/#migrations 09.05.2016
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

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

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: [email protected]