Міграція схеми Realm у мобільному застосунку: як не втратити дані

Міграція схеми Realm у мобільному застосунку: як не втратити дані Realm кидає `Migration is required due to the following errors` при невідповідності схеми. Якщо в застосунку з 10 000 користувачів не задати правильну міграцію, оновлення викличе краш у кожного десятого — і негативні відгуки в App

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Міграція схеми Realm у мобільному застосунку: як не втратити дані
Середній
~2-3 дні

Наші компетенції:

Часті запитання

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    895
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    782
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1216
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1079
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    1002
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    597

Міграція схеми Realm у мобільному застосунку: як не втратити дані

Realm кидає Migration is required due to the following errors при невідповідності схеми. Якщо в застосунку з 10 000 користувачів не задати правильну міграцію, оновлення викличе краш у кожного десятого — і негативні відгуки в App Store гарантовані. На відміну від Room або Core Data, Realm вимагає явного зазначення поточної версії схеми в конфігурації — і якщо ви про це забули, застосунок впаде при першому зверненні до бази даних. Наш досвід показує, що правильно налаштована міграція з першого разу позбавляє від даунтаймів і скорочує час тестування на 30%.

Як Realm визначає необхідність міграції?

Версія схеми зберігається всередині .realm файлу. Realm порівнює версію у файлі з версією, вказаною в RealmConfiguration.schemaVersion. Якщо версії не збігаються і не задано migrationBlock — виняток. Розробники часто забувають збільшити schemaVersion — це призводить до падіння у 90% користувачів при оновленні. Вартість такого бага — втрата репутації та час на екстрений реліз.

// iOS — базова конфігурація з міграцією let config = Realm.Configuration( schemaVersion: 3, migrationBlock: { migration, oldSchemaVersion in if oldSchemaVersion < 2 { // Міграція 1 → 2: доданий атрибут category migration.enumerateObjects(ofType: Transaction.className()) { old, new in new?["category"] = "" } } if oldSchemaVersion < 3 { // Міграція 2 → 3: перейменування поля migration.renameProperty(onType: Transaction.className(), from: "note", to: "description") } } ) Realm.Configuration.defaultConfiguration = config 

Згідно з офіційною документацією Realm, всі міграції від будь-якої старої версії до поточної виконуються в одному migrationBlock — Realm сам визначає, з якої версії починати. Якщо у вас 5 версій, а у користувача файл на версії 1, Realm застосує всі проміжні кроки послідовно.

Чому важливо правильно налаштувати schemaVersion?

Кожного разу при зміні моделі даних (додавання, видалення, перейменування полів) необхідно збільшувати schemaVersion хоча б на 1. Якщо цього не зробити, Realm викине виняток при спробі відкрити базу на пристрої користувача. Уявіть: ви випустили оновлення з новою версією моделі, але забули оновити версію схеми — всі користувачі (а їх може бути мільйон) не зможуть запустити застосунок. Вартість такого бага вимірюється не лише часом на виправлення, а й репутаційними втратами. Ми гарантуємо, що у вашому проєкті цього не станеться. Економія на підтримці після грамотної міграції окупається за 2–4 тижні.

Які типи операцій підтримуються в migrationBlock?

Додавання поля

Realm додає нові поля автоматично з default-значеннями — але тільки якщо поле optional або має дефолт у моделі. Для заповнення нестандартними значеннями — enumerateObjects. На Android (Realm Kotlin SDK) міграція налаштовується через AutomaticSchemaMigration:

// Android (Realm Kotlin SDK) migration.iterate("Transaction") { oldObject, newObject -> val oldCategory = oldObject.getNullableValue<String>("category") newObject.set("category", oldCategory ?: "uncategorized") } 

Видалення поля

Realm просто ігнорує поля, яких немає в новій моделі. Явної міграції не потрібно — але schemaVersion збільшити необхідно. Це часто викликає плутанину: розробники думають, що видалення безпечне, але якщо не оновити версію, Realm викине виняток.

Перейменування поля

migration.renameProperty(onType: "User", from: "fullName", to: "displayName") 

Це зберігає дані. Якщо видалити старе поле і додати нове — дані втратяться. Ми рекомендуємо завжди використовувати renameProperty для збереження зворотної сумісності.

Зміна типу поля

Пряма конвертація типів не підтримується — це обмеження Realm. Шлях: читаємо старе значення, записуємо в нове поле нового типу, старе поле прибираємо з моделі (Realm видалить автоматично). Наприклад, якщо price був рядком, а став числом з плаваючою точкою:

migration.enumerateObjects(ofType: "Product") { old, new in let priceString = old?["priceString"] as? String ?? "0" new?["price"] = Double(priceString) ?? 0.0 } 

Як відлагоджувати міграцію з Realm Studio?

Realm Studio дозволяє відкрити .realm файл і переглянути дані до та після міграції. Корисно для перевірки коректності. Файл на Android: /data/data/<package>/files/default.realm (доступний через Device Explorer в Android Studio). Realm Studio обробляє файли на 50% швидше, ніж прямий перегляд у браузері, і підтримує фільтрацію за класами.

Інструмент Можливості Швидкість роботи
Realm Studio Перегляд, фільтрація, експорт даних Висока
Браузер (JSON) Тільки читання, без фільтрації Низька

Як ми гарантуємо коректну міграцію: процес і тестування

Міграція схеми — критична операція. Помилка призводить до втрати даних користувачів, а відновлення з бекапу не завжди можливе. Наші інженери мають 5+ років досвіду роботи з Realm і гарантують коректне виконання всіх переходів.

  1. Аналіз поточної схеми та історії змін.
  2. Написання migrationBlock для всіх трансформацій.
  3. Тестування на Realm Studio та на реальному бекапі.
  4. Інтеграція в проєкт і деплой через App Store/Google Play.

Що входить в роботу

Ми надаємо:

  • Документацію змін схеми з описом кожного кроку.
  • Код міграцій з unit-тестами та інтеграційними тестами.
  • Інструкцію з відкату на попередню версію.
  • Підтримку при деплої протягом 2 тижнів.

Вартість міграції розраховується індивідуально, але часто економія на підтримці окупається через місяць. Замовте міграцію Realm прямо зараз і отримайте гарантію збереження даних. Зв'яжіться з нами — ми оцінимо ваш проєкт за один робочий день.

Типові помилки міграції Realm (і як їх уникнути)

  • Забути збільшити schemaVersion — застосунок впаде у всіх користувачів. Завжди перевіряйте, що версія збільшена хоча б на 1.
  • Пропустити обробку nullable полів — дані перетворяться на nil/null. Використовуйте enumerateObjects для явного заповнення.
  • Перейменовувати поле через видалення+додавання — втрата даних. Завжди використовуйте renameProperty.
  • Використовувати різні SDK в одному проєкті (Java + Kotlin) — конфлікт бібліотек. Виберіть один SDK і дотримуйтеся його.
Етап Деталі Терміни
Аналіз Вивчення поточної схеми, списку версій, даних користувачів 0,5 дня
Розробка Створення міграцій: додавання, перейменування, зміна типів 1 день
Тестування Перевірка на Realm Studio, unit-тести, інтеграційне тестування 1 день
Документація Опис змін та інструкція для команди 0,5 дня

Терміни: від 1 дня для простих міграцій до 3 днів для складних багатокрокових переходів. Оцінимо ваш проєкт безкоштовно. Отримайте консультацію з міграції Realm вже сьогодні — зв'яжіться з нами, і ми запропонуємо оптимальне рішення.