Зберігання даних у мобільній розробці: що це, які способи та як працює

Автор: IT Sectr Опубліковано: 2026-03-08 Час читання: 9 хв

Зберігання даних — одне з ключових завдань мобільного додатка, що впливає на продуктивність, безпеку та користувацький досвід. У цій статті розберемо SQLite, Room, Core Data, Realm, Firebase Firestore, SharedPreferences, DataStore, Keystore та Keychain, а також формати серіалізації (JSON, Protobuf) і бібліотеки (Gson, Moshi, kotlinx.serialization). Гайд допоможе початківцям вибрати правильне рішення для зберігання даних. Детальніше — в офіційному керівництві Android по зберіганню даних.

Головне

  • Room (Android) та Core Data (iOS) — офіційні ORM для роботи з реляційними базами даних на кожній платформі
  • SharedPreferences (Android) замінюється на DataStore — асинхронне та типобезпечне сховище пар «ключ-значення»
  • Для безпечного зберігання токенів використовуються Keystore (Android) та Keychain (iOS) з апаратним захистом
  • Firebase Firestore — NoSQL база даних з реалтайм-синхронізацією та офлайн-режимом
  • Серіалізація — перетворення об'єктів на JSON/Protobuf через Gson, Moshi, kotlinx.serialization

Локальні бази даних: SQLite, Room, Core Data, Realm

Для зберігання структурованих даних з відносинами між сутностями використовуються реляційні бази даних.

SQLite

SQLite — вбудована реляційна БД, що працює на будь-яких мобільних платформах. Не вимагає окремого сервера, дані зберігаються в одному файлі. SQLite — основа для Room (Android) та опціонально для Core Data (iOS). Бібліотеки: android.database.sqlite (Android), FMDB/Core Data (iOS), sqflite (Flutter).

Room (Android)

Room — офіційна бібліотека Android Architecture Components для роботи з SQLite. Надає ORM-шар: Entity (таблиця), DAO (запити), Database (точка входу). Room перевіряє SQL-запити на етапі компіляції, підтримує корутини та Flow, автоматично мігрує схему.

kotlin
@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 (iOS)

Core Data — фреймворк Apple для управління графом об'єктів. Не є чистою БД — це шар персистентності поверх SQLite, XML або бінарного сховища. Core Data керує об'єктами (NSManagedObject), їхніми відносинами, версіонуванням схеми, скасуванням/повтором (undo/redo) та роботою з багатопотоковістю через NSManagedObjectContext.

Realm

Realm — альтернатива SQLite, розроблена як високопродуктивна мобільна БД. Realm швидше SQLite на читанні та записі, підтримує реактивні сповіщення (Live Objects), шифрування на льоту та кроссплатформенність (Android, iOS, Flutter, React Native). Недоліки: збільшений розмір APK/IPA та більша витрата пам'яті.

Сховища «ключ-значення» та налаштування

Для зберігання невеликих обсягів даних (налаштування, токени, кеш) використовуються прості сховища пар «ключ-значення».

SharedPreferences (Android)

SharedPreferences — застаріле сховище пар «ключ-значення» в Android. Мінуси: синхронний доступ (блокує UI при читанні), відсутність типізації, ризик ANR при завантаженні великого файлу. НЕ рекомендується для нових проєктів.

DataStore (Jetpack Android)

DataStore — сучасна заміна SharedPreferences від Google. Працює асинхронно через Kotlin Coroutines та Flow, підтримує Preferences DataStore (ключ-значення) та Proto DataStore (типізовані дані через Protobuf). DataStore безпечний для UI-потоку та підтримує транзакції.

NSUserDefaults (iOS)

UserDefaults — стандартне сховище для невеликих налаштувань в iOS. Підтримує примітивні типи, рядки, дати, Data. UserDefaults синхронний, тому для великих обсягів даних не підходить. Реєстрація значень через register(defaults:) задає значення за замовчуванням.

Хмарні бази даних: Firebase Firestore та Realtime DB

Для зберігання даних у додатках, що потребують синхронізації між пристроями, використовуються хмарні БД Firebase.

Cloud Firestore

Firebase Firestore — NoSQL документна база даних з реалтайм-підписками, автоматичним масштабуванням, потужними запитами та вбудованим офлайн-режимом. Дані організуються в колекції та документи (JSON-подібні структури). Firestore підтримує транзакції та пакетні операції. Ідеально підходить для чатів, стрічок, соціальних додатків.

Firebase Realtime Database

Firebase Realtime Database — старіша NoSQL БД Firebase, що зберігає дані у вигляді одного JSON-дерева. Простіша за Firestore, але менш гнучка в запитах та масштабуванні. Рекомендується для простих реалтайм-додатків (онлайн-статус, прості чати).

Характеристика Cloud Firestore Firebase Realtime DB
Модель данихКолекції → ДокументиJSON-дерево
ЗапитиСкладні (фільтрація, сортування, ліміти)Прості (за ключем)
МасштабуванняАвтоматичнеРучне шардування
Офлайн-режимТак (персистентний кеш)Так
ЦінаЗа операції читання/записуЗа трафік + зберігання

Безпечне зберігання: Keystore, Keychain та EncryptedSharedPreferences

Зберігання токенів, паролів та ключів шифрування потребує спеціальних захищених сховищ.

Android Keystore

Android Keystore — системне сховище криптографічних ключів. Ключі зберігаються в апаратному середовищі (TEE — Trusted Execution Environment), недоступному для додатків та ОС. Підтримує генерацію ключів, шифрування, підпис. З Android 9+ — StrongBox Keymaster (окремий чип).

iOS Keychain

Keychain Services — захищене сховище iOS для паролів, ключів та сертифікатів. Дані шифруються з використанням апаратного Secure Enclave. Keychain підтримує рівні доступності: Always, WhenUnlocked, WhenUnlockedThisDeviceOnly, AfterFirstUnlock.

EncryptedSharedPreferences (Android)

EncryptedSharedPreferences — обгортка над SharedPreferences з шифруванням ключів та значень через AES256-GCM та HKDF. Реалізована в бібліотеці AndroidX Security. Рекомендується для зберігання токенів та конфіденційних налаштувань.

В IT Sectr ми використовуємо Android Keystore + EncryptedSharedPreferences для зберігання refresh-токенів та biometric-based ключів. На iOS використовуємо Keychain з рівнем kSecAttrAccessibleWhenUnlockedThisDeviceOnly для максимальної безпеки.

Файлове зберігання: Internal, External, Cache Directory

Для файлового зберігання (зображення, відео, документи) мобільні платформи надають кілька типів сховищ.

Android Storage

Android розрізняє Internal Storage (/data/data/пакет/ — приватне сховище) та External Storage (SD-карта або емульований розділ). Cache Directory — тимчасове сховище, яке система може очистити. Scoped Storage (Android 10+) обмежує доступ до External Storage — додатки бачать лише свої файли або файли через MediaStore/SAF.

iOS Storage

iOS надає Documents Directory (iCloud-backup, постійні дані), Library/Caches (тимчасові файли, не бекяпляться) та Tmp Directory (тимчасові, можуть бути очищені). Використовуйте NSFileManager для роботи з файловою системою. З iOS 11+ підтримується File Provider для хмарних файлів.

Серіалізація даних: JSON, Protobuf та бібліотеки

Серіалізація — перетворення об'єктів у формат для передачі або зберігання. Десеріалізація — зворотний процес.

Формати

JSON (JavaScript Object Notation) — найпопулярніший формат: читабельний, гнучкий, підтримується всіма платформами. XML — більш строгий, використовується в легасі-системах. Protobuf (Protocol Buffers) — бінарний формат від Google: компактніший за JSON в 3-10 разів, швидше парситься, має строгу схему. Використовується для високонавантажених систем та мікросервісів.

Бібліотеки Android

  • Gson (Google) — проста, гнучка, але повільна. Автоматично працює з Java/Kotlin об'єктами
  • Moshi (Square) — швидше за Gson, краща підтримка Kotlin (non-null властивості, default values, sealed classes)
  • kotlinx.serialization — нативна Kotlin-серіалізація від JetBrains, працює на етапі компіляції, підтримує JSON, Protobuf, CBOR

Бібліотеки iOS

JSONSerialization — вбудований API для роботи з JSON. Codable (Encodable/Decodable) — сучасний протокол Swift для автоматичної серіалізації в JSON, Property List та інші формати.

swift
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)

Кроссплатформенні рішення: Hive, ObjectBox, Drift

Для Flutter та React Native існують власні ефективні бібліотеки зберігання.

Hive (Flutter)

Hive — легке, швидке key-value сховище для Flutter. Не потребує нативного коду (чистий Dart), підтримує типізацію через TypeAdapter, працює в ізолятах. Ідеально для кешу, налаштувань, невеликих обсягів даних.

ObjectBox

ObjectBox — високопродуктивна вбудована БД для Flutter, Android та iOS. Швидше за SQLite в 10+ разів, використовує пласку файлову структуру для мінімального оверхеду. Підтримує відносини, запити, реактивні підписки (ObjectBox Dart).

Drift (колишній Moor)

Drift — реактивна бібліотека SQLite для Flutter та Dart. Надає типобезпечні запити, міграції, DAO-функції, підтримку Stream (реактивні оновлення). Drift — основний вибір для Flutter-проєктів, що потребують SQLite.

Часто задавані питання

Що краще використовувати для локального зберігання даних: Room чи Core Data?

Вибір залежить від платформи: Room (Android) — офіційна бібліотека на основі SQLite з перевіркою запитів на етапі компіляції. Core Data (iOS) — фреймворк Apple з графом об'єктів. Для кроссплатформенних проєктів підійде Realm або SQLite через ORM.

Чим відрізняється SharedPreferences від DataStore?

SharedPreferences — стара реалізація з синхронним доступом та ризиком ANR. DataStore (Jetpack) — сучасна заміна на основі Kotlin Coroutines та Flow, підтримує асинхронність, типізацію та захист від помилок.

Як безпечно зберігати токени та паролі в мобільному додатку?

Android: EncryptedSharedPreferences або Android Keystore. iOS: Keychain Services з рівнем доступу WhenUnlockedThisDeviceOnly. Для критичних даних використовуйте Secure Enclave (iOS) та апаратний Keystore (Android) з біометрією.

Що таке Firebase Firestore і коли його варто використовувати?

Cloud Firestore — NoSQL база даних від Firebase з реалтайм-синхронізацією, офлайн-режимом та автоматичним масштабуванням. Підходить для чатів, стрічок новин та проєктів, де потрібна синхронізація між пристроями.

Які ORM існують для Flutter та React Native?

Flutter: Hive (швидке key-value), Floor (SQLite ORM), Drift (Moor, реактивний SQLite), ObjectBox (високопродуктивна вбудована БД). React Native: Realm, WatermelonDB (ліниве завантаження) та AsyncStorage (аналог SharedPreferences).

Підсумки

  • Room (Android) та Core Data (iOS) — офіційні рішення для реляційних БД на кожній платформі
  • DataStore замінює SharedPreferences для асинхронного зберігання налаштувань
  • Keystore / Keychain — обов'язкові для безпечного зберігання токенів та ключів
  • Firebase Firestore — найкращий вибір для реалтайм-синхронізації між пристроями
  • Kotlinx.serialization (Android) та Codable (iOS) — сучасні підходи до серіалізації
  • Для Flutter: Drift (SQLite), Hive (key-value), ObjectBox (висока продуктивність)
  • Realm — кроссплатформенна альтернатива SQLite з реактивними сповіщеннями

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект