Съхранението на данни е една от ключовите задачи на мобилното приложение, влияеща върху производителността, сигурността и потребителското изживяване. В тази статия ще разгледаме 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), връзки, версиониране на схема, отмяна/повторение и многонишковост чрез 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 за съхранение на токени за опресняване и биометрични ключове. На 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 резервно копие, постоянни данни), Library/Caches (временни файлове, без резервно копие) и Tmp Directory (временни, могат да бъдат изчистени). Използвайте NSFileManager за работа с файловата система. iOS 11+ поддържа File Provider за облачни файлове.
Сериализацията преобразува обекти във формат за предаване или съхранение. Десериализацията е обратният процес.
JSON (JavaScript Object Notation) е най-популярният формат: четим, гъвкав, поддържан от всички платформи. XML е по-строг, използва се в наследени системи. Protobuf (Protocol Buffers) е двоичен формат от Google: 3-10 пъти по-компактен от JSON, по-бързо парсване, със строга схема. Използва се за системи с високо натоварване и микроуслуги.
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. Тя е 10+ пъти по-бърза от SQLite, използва плоска файлова структура за минимално натоварване. Поддържа връзки, заявки и реактивни абонаменти (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 г. Ще ви консултираме и ще предложим най-доброто решение.