Съхранение на данни в мобилната разработка: какво е, методи и как работи

Автор: 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), връзки, версиониране на схема, отмяна/повторение и многонишковост чрез 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 FirestoreFirebase 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 за съхранение на токени за опресняване и биометрични ключове. На 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 резервно копие, постоянни данни), Library/Caches (временни файлове, без резервно копие) и Tmp Directory (временни, могат да бъдат изчистени). Използвайте NSFileManager за работа с файловата система. iOS 11+ поддържа File Provider за облачни файлове.

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

Сериализацията преобразува обекти във формат за предаване или съхранение. Десериализацията е обратният процес.

Формати

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

Android библиотеки

  • Gson (Google) — прост, гъвкав, но бавен. Работи автоматично с Java/Kotlin обекти
  • Moshi (Square) — по-бърз от Gson, по-добра поддръжка на Kotlin (не-нулеви свойства, стойности по подразбиране, запечатани класове)
  • 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. Тя е 10+ пъти по-бърза от SQLite, използва плоска файлова структура за минимално натоварване. Поддържа връзки, заявки и реактивни абонаменти (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 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта