Az adattárolás az egyik kulcsfontosságú feladata egy mobilalkalmazásnak, amely befolyásolja a teljesítményt, biztonságot és felhasználói élményt. Ebben a cikkben áttekintjük a SQLite, Room, Core Data, Realm, Firebase Firestore, SharedPreferences, DataStore, Keystore és Keychain megoldásokat, valamint a szerializációs formátumokat (JSON, Protobuf) és könyvtárakat (Gson, Moshi, kotlinx.serialization). Ez az útmutató segít a kezdő fejlesztőknek kiválasztani a megfelelő adattárolási megoldást. További információ a hivatalos Android adattárolási útmutatóban.
Főbb pontok
A strukturált adatok entitások közötti kapcsolatokkal történő tárolásához relációs adatbázisokat használunk.
SQLite egy beágyazott relációs adatbázis, amely bármely mobil platformon működik. Nem igényel külön szervert, az adatok egyetlen fájlban tárolódnak. Az SQLite a Room (Android) és opcionálisan a Core Data (iOS) alapja. Könyvtárak: android.database.sqlite (Android), FMDB/Core Data (iOS), sqflite (Flutter).
Room a hivatalos Android Architecture Components könyvtár a SQLite-tal való munkához. ORM réteget biztosít: Entity (tábla), DAO (lekérdezések), Database (belépési pont). A Room ellenőrzi az SQL lekérdezéseket fordítási időben, támogatja a korutinokat és Flow-t, és automatikusan migrálja a sémát.
@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 az Apple keretrendszere objektumgráf kezelésére. Nem tiszta adatbázis — egy perzisztencia réteg az SQLite, XML vagy bináris tárolás felett. A Core Data kezeli az objektumokat (NSManagedObject), kapcsolatokat, sémaverziózást, visszavonás/ismétlés és a több szálon történő munkát az NSManagedObjectContext segítségével.
Realm egy alternatíva a SQLite-ra, nagy teljesítményű mobil adatbázisként tervezve. A Realm gyorsabb, mint a SQLite olvasásban és írásban, támogatja a reaktív értesítéseket (Live Objects), a menet közbeni titkosítást és a platformfüggetlenséget (Android, iOS, Flutter, React Native). Hátrányok: megnövekedett APK/IPA méret és nagyobb memóriahasználat.
Kis mennyiségű adat (beállítások, tokenek, gyorsítótár) tárolásához egyszerű kulcs-érték tárolókat használunk.
SharedPreferences egy örökölt kulcs-érték tároló Androidon. Hátrányok: szinkron hozzáférés (blokkolja az UI-t olvasáskor), tipizálás hiánya, ANR kockázat nagy fájl betöltésekor. NEM ajánlott új projektekhez.
DataStore a SharedPreferences modern helyettesítője a Google-tól. Aszinkron módon működik Kotlin Coroutines és Flow segítségével, támogatja a Preferences DataStore-t (kulcs-érték) és a Proto DataStore-t (tipizált adatok Protobuf segítségével). A DataStore biztonságos az UI szál számára és támogatja a tranzakciókat.
UserDefaults a standard tároló kis beállításokhoz iOS-en. Támogatja a primitív típusokat, karakterláncokat, dátumokat, Data-t. A UserDefaults szinkron, ezért nagy adatmennyiségekhez nem alkalmas. Az értékek regisztrációja a register(defaults:) segítségével állítja be az alapértelmezett értékeket.
Az eszközök közötti szinkronizációt igénylő alkalmazások adattárolásához Firebase felhőadatbázisokat használunk.
Firebase Firestore egy NoSQL dokumentumadatbázis valós idejű feliratkozásokkal, automatikus skálázással, hatékony lekérdezésekkel és beépített offline móddal. Az adatok gyűjteményekbe és dokumentumokba (JSON-szerű struktúrák) szerveződnek. A Firestore támogatja a tranzakciókat és a kötegelt műveleteket. Ideális csevegésekhez, hírfolyamokhoz és közösségi alkalmazásokhoz.
Firebase Realtime Database egy régebbi Firebase NoSQL adatbázis, amely az adatokat egyetlen JSON-faként tárolja. Egyszerűbb, mint a Firestore, de kevésbé rugalmas a lekérdezésekben és a skálázásban. Egyszerű valós idejű alkalmazásokhoz (online állapot, egyszerű csevegések) ajánlott.
| Jellemző | Cloud Firestore | Firebase Realtime DB |
|---|---|---|
| Adatmodell | Gyűjtemények → Dokumentumok | JSON-fa |
| Lekérdezések | Összetett (szűrés, rendezés, korlátok) | Egyszerű (kulcs szerint) |
| Skálázás | Automatikus | Kézi sharding |
| Offline mód | Igen (perzisztens gyorsítótár) | Igen |
| Ár | Olvasási/írási műveletenként | Forgalom + tárolás szerint |
A tokenek, jelszavak és titkosítási kulcsok tárolása speciális védett tárolókat igényel.
Android Keystore egy rendszertároló kriptográfiai kulcsok számára. A kulcsok hardveres környezetben (TEE — Trusted Execution Environment) tárolódnak, amely az alkalmazások és az operációs rendszer számára hozzáférhetetlen. Támogatja a kulcsgenerálást, titkosítást és aláírást. Android 9+ tartalmazza a StrongBox Keymaster-t (dedikált chip).
Keychain Services egy biztonságos iOS-tároló jelszavak, kulcsok és tanúsítványok számára. Az adatok a hardveres Secure Enclave segítségével vannak titkosítva. A Keychain támogatja a hozzáférhetőségi szinteket: Always, WhenUnlocked, WhenUnlockedThisDeviceOnly, AfterFirstUnlock.
EncryptedSharedPreferences egy burkoló a SharedPreferences köré kulcs- és értéktitkosítással AES256-GCM és HKDF segítségével. Az AndroidX Security könyvtárban van megvalósítva. Tokenek és érzékeny beállítások tárolására ajánlott.
Az IT Sectr-nél Android Keystore + EncryptedSharedPreferences-t használunk a frissítési tokenek és biometrikus kulcsok tárolására. iOS-en a kSecAttrAccessibleWhenUnlockedThisDeviceOnly szintű Keychain-t használjuk a maximális biztonság érdekében.
A fájltároláshoz (képek, videók, dokumentumok) a mobil platformok több típusú tárolót kínálnak.
Az Android megkülönbözteti a Internal Storage-t (/data/data/csomag/ — privát tároló) és az External Storage-t (SD kártya vagy emulált partíció). A Cache Directory egy ideiglenes tároló, amelyet a rendszer törölhet. A Scoped Storage (Android 10+) korlátozza a hozzáférést az External Storage-hoz — az alkalmazások csak saját fájljaikat vagy a MediaStore/SAF segítségével elért fájlokat látják.
Az iOS Documents Directory (iCloud biztonsági mentés, állandó adatok), Library/Caches (ideiglenes fájlok, nincs biztonsági mentés) és Tmp Directory (ideiglenes, törölhető) tárolókat biztosít. Használja az NSFileManager-t a fájlrendszerrel való munkához. iOS 11+ támogatja a File Provider-t a felhőfájlokhoz.
A szerializáció az objektumokat átviteli vagy tárolási formátumba konvertálja. A deszerializáció a fordított folyamat.
JSON (JavaScript Object Notation) a legnépszerűbb formátum: olvasható, rugalmas, minden platform támogatja. XML szigorúbb, örökölt rendszerekben használatos. Protobuf (Protocol Buffers) egy bináris formátum a Google-tól: 3-10-szer kompaktabb, mint a JSON, gyorsabb elemzés, szigorú sémával. Nagy terhelésű rendszerekhez és mikroszolgáltatásokhoz használatos.
JSONSerialization a beépített API a JSONnal való munkához. Codable (Encodable/Decodable) egy modern Swift protokoll az automatikus szerializációhoz JSON, Property List és más formátumokba.
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)
A Flutter és React Native számára saját hatékony tárolási könyvtárak léteznek.
Hive egy könnyű, gyors kulcs-érték tároló Flutter számára. Nem igényel natív kódot (tiszta Dart), támogatja a tipizálást TypeAdapter segítségével, és izolátumokban működik. Ideális gyorsítótárhoz, beállításokhoz és kis adatmennyiségekhez.
ObjectBox egy nagy teljesítményű beágyazott adatbázis Flutter, Android és iOS számára. 10+szor gyorsabb, mint a SQLite, lapos fájlszerkezetet használ a minimális többletterhelés érdekében. Támogatja a kapcsolatokat, lekérdezéseket és reaktív feliratkozásokat (ObjectBox Dart).
Drift egy reaktív SQLite könyvtár Flutter és Dart számára. Típusbiztos lekérdezéseket, migrációkat, DAO függvényeket és Stream támogatást (reaktív frissítések) biztosít. A Drift az elsődleges választás az SQLite-ot igénylő Flutter projektekhez.
Gyakran Ismételt Kérdések
A választás a platformtól függ: Room (Android) a hivatalos SQLite-alapú könyvtár fordítási idejű lekérdezés-ellenőrzéssel. A Core Data (iOS) az Apple keretrendszere objektumgráffal. Platformfüggetlen projektekhez a Realm vagy a SQLite ORM-en keresztül megfelelő.
A SharedPreferences egy régi implementáció szinkron hozzáféréssel és ANR kockázattal. DataStore (Jetpack) egy modern helyettesítő Kotlin Coroutines és Flow alapokon, amely támogatja az aszinkronitást, tipizálást és hibavédelmet.
Android: EncryptedSharedPreferences vagy Android Keystore. iOS: Keychain Services WhenUnlockedThisDeviceOnly hozzáférhetőséggel. Kritikus adatokhoz használja a Secure Enclave-t (iOS) és a hardveres Keystore-t (Android) biometriával.
Cloud Firestore egy NoSQL adatbázis a Firebase-től valós idejű szinkronizációval, offline móddal és automatikus skálázással. Alkalmas csevegésekhez, hírcsatornákhoz és olyan projektekhez, amelyek eszközök közötti szinkronizációt igényelnek.
Flutter: Hive (gyors kulcs-érték), Floor (SQLite ORM), Drift (Moor, reaktív SQLite), ObjectBox (nagy teljesítményű beágyazott adatbázis). React Native: Realm, WatermelonDB (lusta betöltés) és AsyncStorage (SharedPreferences analóg).
Összegzés
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.