Хранение данных в мобильной разработке: что это, какие способы и как работает

Автор: 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 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект