Зберігання даних — одне з ключових завдань мобільного додатка, що впливає на продуктивність, безпеку та користувацький досвід. У цій статті розберемо SQLite, Room, Core Data, Realm, Firebase Firestore, SharedPreferences, DataStore, Keystore та Keychain, а також формати серіалізації (JSON, Protobuf) і бібліотеки (Gson, Moshi, kotlinx.serialization). Гайд допоможе початківцям вибрати правильне рішення для зберігання даних. Детальніше — в офіційному керівництві Android по зберіганню даних.
Головне
Для зберігання структурованих даних з відносинами між сутностями використовуються реляційні бази даних.
SQLite — вбудована реляційна БД, що працює на будь-яких мобільних платформах. Не вимагає окремого сервера, дані зберігаються в одному файлі. SQLite — основа для Room (Android) та опціонально для Core Data (iOS). Бібліотеки: android.database.sqlite (Android), FMDB/Core Data (iOS), sqflite (Flutter).
Room — офіційна бібліотека Android Architecture Components для роботи з SQLite. Надає ORM-шар: Entity (таблиця), DAO (запити), Database (точка входу). Room перевіряє SQL-запити на етапі компіляції, підтримує корутини та Flow, автоматично мігрує схему.
@Entity data class User( @PrimaryKey val id: Int, val name: String, val email: String ) @Dao interface UserDao { @Query("SELECT * FROM user WHERE id = :id") suspend fun getUser(id: Int): User? }
Core Data — фреймворк Apple для управління графом об'єктів. Не є чистою БД — це шар персистентності поверх SQLite, XML або бінарного сховища. Core Data керує об'єктами (NSManagedObject), їхніми відносинами, версіонуванням схеми, скасуванням/повтором (undo/redo) та роботою з багатопотоковістю через NSManagedObjectContext.
Realm — альтернатива SQLite, розроблена як високопродуктивна мобільна БД. Realm швидше SQLite на читанні та записі, підтримує реактивні сповіщення (Live Objects), шифрування на льоту та кроссплатформенність (Android, iOS, Flutter, React Native). Недоліки: збільшений розмір APK/IPA та більша витрата пам'яті.
Для зберігання невеликих обсягів даних (налаштування, токени, кеш) використовуються прості сховища пар «ключ-значення».
SharedPreferences — застаріле сховище пар «ключ-значення» в Android. Мінуси: синхронний доступ (блокує UI при читанні), відсутність типізації, ризик ANR при завантаженні великого файлу. НЕ рекомендується для нових проєктів.
DataStore — сучасна заміна SharedPreferences від Google. Працює асинхронно через Kotlin Coroutines та Flow, підтримує Preferences DataStore (ключ-значення) та Proto DataStore (типізовані дані через Protobuf). DataStore безпечний для UI-потоку та підтримує транзакції.
UserDefaults — стандартне сховище для невеликих налаштувань в iOS. Підтримує примітивні типи, рядки, дати, Data. UserDefaults синхронний, тому для великих обсягів даних не підходить. Реєстрація значень через register(defaults:) задає значення за замовчуванням.
Для зберігання даних у додатках, що потребують синхронізації між пристроями, використовуються хмарні БД Firebase.
Firebase Firestore — NoSQL документна база даних з реалтайм-підписками, автоматичним масштабуванням, потужними запитами та вбудованим офлайн-режимом. Дані організуються в колекції та документи (JSON-подібні структури). Firestore підтримує транзакції та пакетні операції. Ідеально підходить для чатів, стрічок, соціальних додатків.
Firebase Realtime Database — старіша NoSQL БД Firebase, що зберігає дані у вигляді одного JSON-дерева. Простіша за Firestore, але менш гнучка в запитах та масштабуванні. Рекомендується для простих реалтайм-додатків (онлайн-статус, прості чати).
| Характеристика | Cloud Firestore | Firebase Realtime DB |
|---|---|---|
| Модель даних | Колекції → Документи | JSON-дерево |
| Запити | Складні (фільтрація, сортування, ліміти) | Прості (за ключем) |
| Масштабування | Автоматичне | Ручне шардування |
| Офлайн-режим | Так (персистентний кеш) | Так |
| Ціна | За операції читання/запису | За трафік + зберігання |
Зберігання токенів, паролів та ключів шифрування потребує спеціальних захищених сховищ.
Android Keystore — системне сховище криптографічних ключів. Ключі зберігаються в апаратному середовищі (TEE — Trusted Execution Environment), недоступному для додатків та ОС. Підтримує генерацію ключів, шифрування, підпис. З Android 9+ — StrongBox Keymaster (окремий чип).
Keychain Services — захищене сховище iOS для паролів, ключів та сертифікатів. Дані шифруються з використанням апаратного Secure Enclave. Keychain підтримує рівні доступності: Always, WhenUnlocked, WhenUnlockedThisDeviceOnly, AfterFirstUnlock.
EncryptedSharedPreferences — обгортка над SharedPreferences з шифруванням ключів та значень через AES256-GCM та HKDF. Реалізована в бібліотеці AndroidX Security. Рекомендується для зберігання токенів та конфіденційних налаштувань.
В IT Sectr ми використовуємо Android Keystore + EncryptedSharedPreferences для зберігання refresh-токенів та biometric-based ключів. На iOS використовуємо Keychain з рівнем kSecAttrAccessibleWhenUnlockedThisDeviceOnly для максимальної безпеки.
Для файлового зберігання (зображення, відео, документи) мобільні платформи надають кілька типів сховищ.
Android розрізняє Internal Storage (/data/data/пакет/ — приватне сховище) та External Storage (SD-карта або емульований розділ). Cache Directory — тимчасове сховище, яке система може очистити. Scoped Storage (Android 10+) обмежує доступ до External Storage — додатки бачать лише свої файли або файли через MediaStore/SAF.
iOS надає Documents Directory (iCloud-backup, постійні дані), Library/Caches (тимчасові файли, не бекяпляться) та Tmp Directory (тимчасові, можуть бути очищені). Використовуйте NSFileManager для роботи з файловою системою. З iOS 11+ підтримується File Provider для хмарних файлів.
Серіалізація — перетворення об'єктів у формат для передачі або зберігання. Десеріалізація — зворотний процес.
JSON (JavaScript Object Notation) — найпопулярніший формат: читабельний, гнучкий, підтримується всіма платформами. XML — більш строгий, використовується в легасі-системах. Protobuf (Protocol Buffers) — бінарний формат від Google: компактніший за JSON в 3-10 разів, швидше парситься, має строгу схему. Використовується для високонавантажених систем та мікросервісів.
JSONSerialization — вбудований API для роботи з JSON. Codable (Encodable/Decodable) — сучасний протокол Swift для автоматичної серіалізації в JSON, Property List та інші формати.
struct User: Codable { let id: Int let name: String let email: String } let user = User(id: 1, name: "Alice", email: "alice@example.com") let encoder = JSONEncoder() let jsonData = try encoder.encode(user)
Для Flutter та React Native існують власні ефективні бібліотеки зберігання.
Hive — легке, швидке key-value сховище для Flutter. Не потребує нативного коду (чистий Dart), підтримує типізацію через TypeAdapter, працює в ізолятах. Ідеально для кешу, налаштувань, невеликих обсягів даних.
ObjectBox — високопродуктивна вбудована БД для Flutter, Android та iOS. Швидше за SQLite в 10+ разів, використовує пласку файлову структуру для мінімального оверхеду. Підтримує відносини, запити, реактивні підписки (ObjectBox Dart).
Drift — реактивна бібліотека SQLite для Flutter та Dart. Надає типобезпечні запити, міграції, DAO-функції, підтримку Stream (реактивні оновлення). Drift — основний вибір для Flutter-проєктів, що потребують SQLite.
Часто задавані питання
Вибір залежить від платформи: Room (Android) — офіційна бібліотека на основі SQLite з перевіркою запитів на етапі компіляції. Core Data (iOS) — фреймворк Apple з графом об'єктів. Для кроссплатформенних проєктів підійде Realm або SQLite через ORM.
SharedPreferences — стара реалізація з синхронним доступом та ризиком ANR. DataStore (Jetpack) — сучасна заміна на основі Kotlin Coroutines та Flow, підтримує асинхронність, типізацію та захист від помилок.
Android: EncryptedSharedPreferences або Android Keystore. iOS: Keychain Services з рівнем доступу WhenUnlockedThisDeviceOnly. Для критичних даних використовуйте Secure Enclave (iOS) та апаратний Keystore (Android) з біометрією.
Cloud Firestore — NoSQL база даних від Firebase з реалтайм-синхронізацією, офлайн-режимом та автоматичним масштабуванням. Підходить для чатів, стрічок новин та проєктів, де потрібна синхронізація між пристроями.
Flutter: Hive (швидке key-value), Floor (SQLite ORM), Drift (Moor, реактивний SQLite), ObjectBox (високопродуктивна вбудована БД). React Native: Realm, WatermelonDB (ліниве завантаження) та AsyncStorage (аналог SharedPreferences).
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.