Ukládání dat je jedním z klíčových úkolů mobilní aplikace, ovlivňujícím výkon, bezpečnost a uživatelský zážitek. V tomto článku se budeme zabývat SQLite, Room, Core Data, Realm, Firebase Firestore, SharedPreferences, DataStore, Keystore a Keychain, stejně jako formáty serializace (JSON, Protobuf) a knihovnami (Gson, Moshi, kotlinx.serialization). Tento průvodce pomůže začínajícím vývojářům vybrat správné řešení pro ukládání dat. Více informací v oficiálním průvodci Android pro ukládání dat.
Hlavní body
Pro ukládání strukturovaných dat s vztahy mezi entitami se používají relační databáze.
SQLite je vestavěná relační databáze fungující na jakékoli mobilní platformě. Nevyžaduje samostatný server, data jsou uložena v jednom souboru. SQLite je základem pro Room (Android) a volitelně pro Core Data (iOS). Knihovny: android.database.sqlite (Android), FMDB/Core Data (iOS), sqflite (Flutter).
Room je oficiální knihovna Android Architecture Components pro práci s SQLite. Poskytuje ORM vrstvu: Entity (tabulka), DAO (dotazy), Database (vstupní bod). Room kontroluje SQL dotazy v době kompilace, podporuje korutiny a Flow a automaticky migruje schéma.
@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 je framework Apple pro správu objektového grafu. Není to čistá databáze — je to perzistentní vrstva nad SQLite, XML nebo binárním úložištěm. Core Data spravuje objekty (NSManagedObject), vztahy, verzování schémat, undo/redo a práci s vlákny prostřednictvím NSManagedObjectContext.
Realm je alternativa k SQLite, navržená jako vysoce výkonná mobilní databáze. Realm je rychlejší než SQLite při čtení i zápisu, podporuje reaktivní oznámení (Live Objects), šifrování za běhu a multiplatformnost (Android, iOS, Flutter, React Native). Nevýhody: větší velikost APK/IPA a vyšší spotřeba paměti.
Pro ukládání malých objemů dat (nastavení, tokeny, mezipaměť) se používají jednoduchá úložiště párů klíč-hodnota.
SharedPreferences je zastaralé úložiště párů klíč-hodnota v Androidu. Nevýhody: synchronní přístup (blokuje UI při čtení), chybějící typování, riziko ANR při načítání velkého souboru. NENÍ doporučeno pro nové projekty.
DataStore je moderní náhrada SharedPreferences od Google. Funguje asynchronně pomocí Kotlin Coroutines a Flow, podporuje Preferences DataStore (klíč-hodnota) a Proto DataStore (typovaná data přes Protobuf). DataStore je bezpečný pro UI vlákno a podporuje transakce.
UserDefaults je standardní úložiště pro malá nastavení v iOS. Podporuje primitivní typy, řetězce, data, Data. UserDefaults je synchronní, proto není vhodný pro velké objemy dat. Registrace hodnot pomocí register(defaults:) nastavuje výchozí hodnoty.
Pro ukládání dat v aplikacích vyžadujících synchronizaci mezi zařízeními se používají cloudové databáze Firebase.
Firebase Firestore je NoSQL dokumentová databáze s předplatnými v reálném čase, automatickým škálováním, výkonnými dotazy a vestavěným offline režimem. Data jsou organizována do kolekcí a dokumentů (struktury podobné JSON). Firestore podporuje transakce a dávkové operace. Ideální pro chaty, kanály a sociální aplikace.
Firebase Realtime Database je starší NoSQL databáze Firebase, která ukládá data jako jeden JSON strom. Jednodušší než Firestore, ale méně flexibilní v dotazech a škálování. Doporučeno pro jednoduché aplikace v reálném čase (online stav, jednoduché chaty).
| Vlastnost | Cloud Firestore | Firebase Realtime DB |
|---|---|---|
| Datový model | Kolekce → Dokumenty | JSON strom |
| Dotazy | Složité (filtrování, řazení, limity) | Jednoduché (podle klíče) |
| Škálování | Automatické | Ruční sharding |
| Offline režim | Ano (trvalá mezipaměť) | Ano |
| Cena | Za operace čtení/zápisu | Za provoz + úložiště |
Ukládání tokenů, hesel a šifrovacích klíčů vyžaduje speciální chráněná úložiště.
Android Keystore je systémové úložiště pro kryptografické klíče. Klíče jsou uloženy v hardwarovém prostředí (TEE — Trusted Execution Environment), nepřístupném aplikacím a operačnímu systému. Podporuje generování klíčů, šifrování a podepisování. Android 9+ obsahuje StrongBox Keymaster (vyhrazený čip).
Keychain Services je bezpečné úložiště iOS pro hesla, klíče a certifikáty. Data jsou šifrována pomocí hardwarového Secure Enclave. Keychain podporuje úrovně přístupnosti: Always, WhenUnlocked, WhenUnlockedThisDeviceOnly, AfterFirstUnlock.
EncryptedSharedPreferences je obal kolem SharedPreferences s šifrováním klíčů a hodnot pomocí AES256-GCM a HKDF. Implementováno v knihovně AndroidX Security. Doporučeno pro ukládání tokenů a citlivých nastavení.
Ve společnosti IT Sectr používáme Android Keystore + EncryptedSharedPreferences pro ukládání obnovovacích tokenů a biometrických klíčů. Na iOS používáme Keychain s úrovní kSecAttrAccessibleWhenUnlockedThisDeviceOnly pro maximální bezpečnost.
Pro ukládání souborů (obrázky, videa, dokumenty) poskytují mobilní platformy několik typů úložišť.
Android rozlišuje Internal Storage (/data/data/balík/ — soukromé úložiště) a External Storage (SD karta nebo emulovaný oddíl). Cache Directory je dočasné úložiště, které může systém vyčistit. Scoped Storage (Android 10+) omezuje přístup k External Storage — aplikace vidí pouze své vlastní soubory nebo soubory přes MediaStore/SAF.
iOS poskytuje Documents Directory (záloha iCloud, trvalá data), Library/Caches (dočasné soubory, bez zálohy) a Tmp Directory (dočasné, lze vyčistit). Pro práci se souborovým systémem použijte NSFileManager. iOS 11+ podporuje File Provider pro cloudové soubory.
Serializace převádí objekty do formátu pro přenos nebo ukládání. Deserializace je opačný proces.
JSON (JavaScript Object Notation) je nejoblíbenější formát: čitelný, flexibilní, podporovaný všemi platformami. XML je přísnější, používaný v zastaralých systémech. Protobuf (Protocol Buffers) je binární formát od Google: 3-10x kompaktnější než JSON, rychlejší parsování, s přísným schématem. Používá se pro systémy s vysokým zatížením a mikroslužby.
JSONSerialization je vestavěné API pro práci s JSON. Codable (Encodable/Decodable) je moderní Swift protokol pro automatickou serializaci do JSON, Property List a dalších formátů.
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)
Pro Flutter a React Native existují vlastní efektivní knihovny pro ukládání.
Hive je lehké, rychlé úložiště klíč-hodnota pro Flutter. Nevyžaduje nativní kód (čistý Dart), podporuje typování přes TypeAdapter a pracuje v izolátech. Ideální pro mezipaměť, nastavení a malé objemy dat.
ObjectBox je vysoce výkonná vestavěná databáze pro Flutter, Android a iOS. Je 10+ krát rychlejší než SQLite, používá plochou strukturu souborů pro minimální režii. Podporuje vztahy, dotazy a reaktivní předplatná (ObjectBox Dart).
Drift je reaktivní knihovna SQLite pro Flutter a Dart. Poskytuje typově bezpečné dotazy, migrace, funkce DAO a podporu Stream (reaktivní aktualizace). Drift je hlavní volbou pro Flutter projekty vyžadující SQLite.
Často kladené otázky
Volba závisí na platformě: Room (Android) je oficiální knihovna založená na SQLite s kontrolou dotazů v době kompilace. Core Data (iOS) je framework Apple s objektovým grafem. Pro multiplatformní projekty je vhodný Realm nebo SQLite přes ORM.
SharedPreferences je stará implementace se synchronním přístupem a rizikem ANR. DataStore (Jetpack) je moderní náhrada založená na Kotlin Coroutines a Flow, podporující asynchronnost, typování a ochranu proti chybám.
Android: EncryptedSharedPreferences nebo Android Keystore. iOS: Keychain Services s přístupností WhenUnlockedThisDeviceOnly. Pro kritická data použijte Secure Enclave (iOS) a hardwarový Keystore (Android) s biometrií.
Cloud Firestore je NoSQL databáze od Firebase s synchronizací v reálném čase, offline režimem a automatickým škálováním. Vhodná pro chaty, zpravodajské kanály a projekty vyžadující synchronizaci mezi zařízeními.
Flutter: Hive (rychlý klíč-hodnota), Floor (SQLite ORM), Drift (Moor, reaktivní SQLite), ObjectBox (výkonná vestavěná DB). React Native: Realm, WatermelonDB (líné načítání) a AsyncStorage (obdoba SharedPreferences).
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.