Хранение данных — одна из ключевых задач мобильного приложения, влияющая на производительность, безопасность и пользовательский опыт. В этой статье разберём 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 года. Мы проконсультируем вас и предложим наилучшее решение.