Міграція схеми 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 і гарантують коректне виконання всіх переходів.
- Аналіз поточної схеми та історії змін.
- Написання migrationBlock для всіх трансформацій.
- Тестування на Realm Studio та на реальному бекапі.
- Інтеграція в проєкт і деплой через 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 вже сьогодні — зв'яжіться з нами, і ми запропонуємо оптимальне рішення.







