Przechowywanie danych w rozwoju mobilnym: co to jest, metody i jak działa

Autor: IT Sectr Opublikowano: 2026-03-08 Czas czytania: 9 min

Przechowywanie danych to jedno z kluczowych zadań aplikacji mobilnej, wpływające na wydajność, bezpieczeństwo i doświadczenie użytkownika. W tym artykule omówimy SQLite, Room, Core Data, Realm, Firebase Firestore, SharedPreferences, DataStore, Keystore i Keychain, a także formaty serializacji (JSON, Protobuf) i biblioteki (Gson, Moshi, kotlinx.serialization). Ten przewodnik pomoże początkującym programistom wybrać odpowiednie rozwiązanie do przechowywania danych. Więcej informacji w oficjalnym przewodniku Android dotyczącym przechowywania danych.

Najważniejsze punkty

  • Room (Android) i Core Data (iOS) to oficjalne ORM do pracy z relacyjnymi bazami danych na każdej platformie
  • SharedPreferences (Android) jest zastępowane przez DataStore — asynchroniczne i bezpieczne typowo magazyn klucz-wartość
  • Do bezpiecznego przechowywania tokenów używa się Keystore (Android) i Keychain (iOS) z ochroną sprzętową
  • Firebase Firestore to baza danych NoSQL z synchronizacją w czasie rzeczywistym i trybem offline
  • Serializacja — konwersja obiektów do JSON/Protobuf za pomocą Gson, Moshi, kotlinx.serialization

Lokalne bazy danych: SQLite, Room, Core Data, Realm

Do przechowywania danych strukturalnych z relacjami między encjami używa się relacyjnych baz danych.

SQLite

SQLite to osadzona relacyjna baza danych działająca na każdej platformie mobilnej. Nie wymaga osobnego serwera, dane są przechowywane w jednym pliku. SQLite jest podstawą dla Room (Android) i opcjonalnie dla Core Data (iOS). Biblioteki: android.database.sqlite (Android), FMDB/Core Data (iOS), sqflite (Flutter).

Room (Android)

Room to oficjalna biblioteka Android Architecture Components do pracy z SQLite. Zapewnia warstwę ORM: Entity (tabela), DAO (zapytania), Database (punkt wejścia). Room sprawdza zapytania SQL w czasie kompilacji, obsługuje korutyny i Flow oraz automatycznie migruje schemat.

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 to framework Apple do zarządzania grafem obiektów. Nie jest czystą bazą danych — to warstwa trwałości na SQLite, XML lub magazynie binarnym. Core Data zarządza obiektami (NSManagedObject), relacjami, versionowaniem schematu, cofaniem/powtarzaniem i wielowątkowością przez NSManagedObjectContext.

Realm

Realm to alternatywa dla SQLite, zaprojektowana jako wysokowydajna mobilna baza danych. Realm jest szybszy od SQLite przy odczycie i zapisie, obsługuje powiadomienia reaktywne (Live Objects), szyfrowanie w locie i wieloplatformowość (Android, iOS, Flutter, React Native). Wady: zwiększony rozmiar APK/IPA i większe zużycie pamięci.

Magazyny klucz-wartość i ustawienia

Do przechowywania małych ilości danych (ustawienia, tokeny, pamięć podręczna) używa się prostych magazynów klucz-wartość.

SharedPreferences (Android)

SharedPreferences to przestarzały magazyn klucz-wartość w Androidzie. Wady: dostęp synchroniczny (blokuje UI podczas odczytu), brak typowania, ryzyko ANR podczas ładowania dużego pliku. NIE zalecane dla nowych projektów.

DataStore (Jetpack Android)

DataStore to nowoczesny zamiennik SharedPreferences od Google. Działa asynchronicznie przez Kotlin Coroutines i Flow, obsługuje Preferences DataStore (klucz-wartość) i Proto DataStore (dane typowane przez Protobuf). DataStore jest bezpieczny dla wątku UI i obsługuje transakcje.

NSUserDefaults (iOS)

UserDefaults to standardowy magazyn dla małych ustawień w iOS. Obsługuje typy prymitywne, ciągi znaków, daty, Data. UserDefaults jest synchroniczny, więc nie nadaje się do dużych wolumenów danych. Rejestracja wartości przez register(defaults:) ustawia wartości domyślne.

Bazy danych w chmurze: Firebase Firestore i Realtime DB

Do przechowywania danych w aplikacjach wymagających synchronizacji między urządzeniami używa się baz danych Firebase w chmurze.

Cloud Firestore

Firebase Firestore to dokumentowa baza danych NoSQL z subskrypcjami w czasie rzeczywistym, automatycznym skalowaniem, potężnymi zapytaniami i wbudowanym trybem offline. Dane są organizowane w kolekcje i dokumenty (struktury podobne do JSON). Firestore obsługuje transakcje i operacje wsadowe. Idealny do czatów, kanałów i aplikacji społecznościowych.

Firebase Realtime Database

Firebase Realtime Database to starsza baza NoSQL Firebase przechowująca dane jako pojedyncze drzewo JSON. Prostsza niż Firestore, ale mniej elastyczna w zapytaniach i skalowaniu. Zalecana do prostych aplikacji czasu rzeczywistego (status online, proste czaty).

CechaCloud FirestoreFirebase Realtime DB
Model danychKolekcje → DokumentyDrzewo JSON
ZapytaniaZłożone (filtrowanie, sortowanie, limity)Proste (po kluczu)
SkalowanieAutomatyczneRęczne shardowanie
Tryb offlineTak (trwała pamięć podręczna)Tak
CenaZa operacje odczytu/zapisuZa ruch + przechowywanie

Bezpieczne przechowywanie: Keystore, Keychain i EncryptedSharedPreferences

Przechowywanie tokenów, haseł i kluczy szyfrowania wymaga specjalnych chronionych magazynów.

Android Keystore

Android Keystore to systemowy magazyn kluczy kryptograficznych. Klucze są przechowywane w środowisku sprzętowym (TEE — Trusted Execution Environment), niedostępnym dla aplikacji i systemu operacyjnego. Obsługuje generowanie kluczy, szyfrowanie i podpisywanie. Android 9+ zawiera StrongBox Keymaster (dedykowany układ).

iOS Keychain

Keychain Services to bezpieczny magazyn iOS dla haseł, kluczy i certyfikatów. Dane są szyfrowane przy użyciu sprzętowego Secure Enclave. Keychain obsługuje poziomy dostępności: Always, WhenUnlocked, WhenUnlockedThisDeviceOnly, AfterFirstUnlock.

EncryptedSharedPreferences (Android)

EncryptedSharedPreferences to otoka wokół SharedPreferences z szyfrowaniem kluczy i wartości przez AES256-GCM i HKDF. Zaimplementowana w bibliotece AndroidX Security. Zalecana do przechowywania tokenów i poufnych ustawień.

W IT Sectr używamy Android Keystore + EncryptedSharedPreferences do przechowywania tokenów odświeżania i kluczy biometrycznych. Na iOS używamy Keychain z poziomem kSecAttrAccessibleWhenUnlockedThisDeviceOnly dla maksymalnego bezpieczeństwa.

Przechowywanie plików: Internal, External, Cache Directory

Do przechowywania plików (obrazy, wideo, dokumenty) platformy mobilne zapewniają kilka typów magazynów.

Android Storage

Android rozróżnia Internal Storage (/data/data/pakiet/ — prywatny magazyn) i External Storage (karta SD lub partycja emulowana). Cache Directory to tymczasowy magazyn, który system może wyczyścić. Scoped Storage (Android 10+) ogranicza dostęp do External Storage — aplikacje widzą tylko własne pliki lub pliki przez MediaStore/SAF.

iOS Storage

iOS zapewnia Documents Directory (kopia zapasowa iCloud, dane trwałe), Library/Caches (pliki tymczasowe, bez kopii zapasowej) i Tmp Directory (tymczasowe, mogą być wyczyszczone). Użyj NSFileManager do pracy z systemem plików. iOS 11+ obsługuje File Provider dla plików w chmurze.

Serializacja danych: JSON, Protobuf i biblioteki

Serializacja konwertuje obiekty do formatu transmisji lub przechowywania. Deserializacja to proces odwrotny.

Formaty

JSON (JavaScript Object Notation) to najpopularniejszy format: czytelny, elastyczny, obsługiwany przez wszystkie platformy. XML jest bardziej rygorystyczny, używany w systemach legacy. Protobuf (Protocol Buffers) to binarny format Google: 3-10 razy bardziej kompaktowy niż JSON, szybsze parsowanie, ścisły schemat. Używany w systemach wysokiego obciążenia i mikrousługach.

Biblioteki Android

  • Gson (Google) — prosty, elastyczny, ale wolny. Działa automatycznie z obiektami Java/Kotlin
  • Moshi (Square) — szybszy niż Gson, lepsze wsparcie Kotlin (właściwości non-null, wartości domyślne, klasy sealed)
  • kotlinx.serialization — natywna serializacja Kotlin od JetBrains, działa w czasie kompilacji, obsługuje JSON, Protobuf, CBOR

Biblioteki iOS

JSONSerialization to wbudowane API do pracy z JSON. Codable (Encodable/Decodable) to nowoczesny protokół Swift do automatycznej serializacji do JSON, Property List i innych formatów.

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)

Rozwiązania wieloplatformowe: Hive, ObjectBox, Drift

Dla Flutter i React Native istnieją własne wydajne biblioteki przechowywania.

Hive (Flutter)

Hive to lekki, szybki magazyn klucz-wartość dla Flutter. Nie wymaga natywnego kodu (czysty Dart), obsługuje typowanie przez TypeAdapter, działa w izolatach. Idealny do pamięci podręcznej, ustawień i małych wolumenów danych.

ObjectBox

ObjectBox to wysokowydajna osadzona baza danych dla Flutter, Android i iOS. Jest 10+ razy szybsza niż SQLite, używa płaskiej struktury plików dla minimalnego narzutu. Obsługuje relacje, zapytania i reaktywne subskrypcje (ObjectBox Dart).

Drift (dawniej Moor)

Drift to reaktywna biblioteka SQLite dla Flutter i Dart. Zapewnia bezpieczne typowo zapytania, migracje, funkcje DAO i wsparcie Stream (reaktywne aktualizacje). Drift to podstawowy wybór dla projektów Flutter wymagających SQLite.

Często zadawane pytania

Co jest lepsze do lokalnego przechowywania danych: Room czy Core Data?

Wybór zależy od platformy: Room (Android) to oficjalna biblioteka oparta na SQLite ze sprawdzaniem zapytań w czasie kompilacji. Core Data (iOS) to framework Apple z grafem obiektów. Do projektów wieloplatformowych odpowiedni jest Realm lub SQLite przez ORM.

Czym różni się SharedPreferences od DataStore?

SharedPreferences to stara implementacja z synchronicznym dostępem i ryzykiem ANR. DataStore (Jetpack) to nowoczesny zamiennik oparty na Kotlin Coroutines i Flow, obsługujący asynchroniczność, typowanie i ochronę przed błędami.

Jak bezpiecznie przechowywać tokeny i hasła w aplikacji mobilnej?

Android: EncryptedSharedPreferences lub Android Keystore. iOS: Keychain Services z dostępnością WhenUnlockedThisDeviceOnly. Do krytycznych danych używaj Secure Enclave (iOS) i sprzętowego Keystore (Android) z biometrią.

Czym jest Firebase Firestore i kiedy go używać?

Cloud Firestore to baza danych NoSQL od Firebase z synchronizacją w czasie rzeczywistym, trybem offline i automatycznym skalowaniem. Odpowiednia do czatów, kanałów informacyjnych i projektów wymagających synchronizacji między urządzeniami.

Jakie ORM istnieją dla Flutter i React Native?

Flutter: Hive (szybki klucz-wartość), Floor (ORM SQLite), Drift (Moor, reaktywny SQLite), ObjectBox (wydajna osadzona BD). React Native: Realm, WatermelonDB (leniwe ładowanie) i AsyncStorage (analog SharedPreferences).

Podsumowanie

  • Room (Android) i Core Data (iOS) to oficjalne rozwiązania dla relacyjnych baz danych na każdej platformie
  • DataStore zastępuje SharedPreferences do asynchronicznego przechowywania ustawień
  • Keystore / Keychain są obowiązkowe do bezpiecznego przechowywania tokenów i kluczy
  • Firebase Firestore to najlepszy wybór do synchronizacji w czasie rzeczywistym między urządzeniami
  • Kotlinx.serialization (Android) i Codable (iOS) to nowoczesne podejścia do serializacji
  • Dla Flutter: Drift (SQLite), Hive (klucz-wartość), ObjectBox (wysoka wydajność)
  • Realm to wieloplatformowa alternatywa dla SQLite z reaktywnymi powiadomieniami

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt