Stocarea datelor este una dintre sarcinile cheie ale unei aplicații mobile, care afectează performanța, securitatea și experiența utilizatorului. În acest articol vom acoperi SQLite, Room, Core Data, Realm, Firebase Firestore, SharedPreferences, DataStore, Keystore și Keychain, precum și formatele de serializare (JSON, Protobuf) și bibliotecile (Gson, Moshi, kotlinx.serialization). Acest ghid va ajuta dezvoltatorii începători să aleagă soluția corectă de stocare a datelor. Mai multe informații în ghidul oficial Android privind stocarea datelor.
Puncte cheie
Pentru stocarea datelor structurate cu relații între entități se utilizează baze de date relaționale.
SQLite este o bază de date relațională încorporată care funcționează pe orice platformă mobilă. Nu necesită un server separat, datele sunt stocate într-un singur fișier. SQLite stă la baza Room (Android) și opțional pentru Core Data (iOS). Biblioteci: android.database.sqlite (Android), FMDB/Core Data (iOS), sqflite (Flutter).
Room este biblioteca oficială Android Architecture Components pentru lucrul cu SQLite. Oferă un strat ORM: Entity (tabel), DAO (interogări), Database (punct de intrare). Room verifică interogările SQL în timpul compilării, suportă corutine și Flow și migrează automat schema.
@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 este framework-ul Apple pentru gestionarea unui graf de obiecte. Nu este o bază de date pură — este un strat de persistență peste SQLite, XML sau stocare binară. Core Data gestionează obiecte (NSManagedObject), relații, versionarea schemei, anulare/refacere și multithreading prin NSManagedObjectContext.
Realm este o alternativă la SQLite, proiectată ca o bază de date mobilă de înaltă performanță. Realm este mai rapid decât SQLite la citire și scriere, suportă notificări reactive (Live Objects), criptare în timp real și cross-platform (Android, iOS, Flutter, React Native). Dezavantaje: dimensiune APK/IPA mărită și consum mai mare de memorie.
Pentru stocarea unor volume mici de date (setări, tokenuri, cache) se utilizează depozite simple de perechi cheie-valoare.
SharedPreferences este un depozit moștenit de perechi cheie-valoare în Android. Dezavantaje: acces sincron (blochează UI la citire), lipsa tipizării, risc ANR la încărcarea fișierelor mari. NU este recomandat pentru proiecte noi.
DataStore este înlocuitorul modern pentru SharedPreferences de la Google. Funcționează asincron prin Kotlin Coroutines și Flow, suportă Preferences DataStore (cheie-valoare) și Proto DataStore (date tipizate prin Protobuf). DataStore este sigur pentru thread-ul UI și suportă tranzacții.
UserDefaults este depozitul standard pentru setări mici în iOS. Suportă tipuri primitive, șiruri, date, Data. UserDefaults este sincron, deci nu este potrivit pentru volume mari de date. Înregistrarea valorilor prin register(defaults:) stabilește valorile implicite.
Pentru stocarea datelor în aplicații care necesită sincronizare între dispozitive, se utilizează baze de date cloud Firebase.
Firebase Firestore este o bază de date documentară NoSQL cu abonamente în timp real, scalare automată, interogări puternice și mod offline încorporat. Datele sunt organizate în colecții și documente (structuri similare JSON). Firestore suportă tranzacții și operații în lot. Ideal pentru chat-uri, fluxuri și aplicații sociale.
Firebase Realtime Database este o bază de date NoSQL mai veche Firebase care stochează datele ca un singur arbore JSON. Mai simplă decât Firestore, dar mai puțin flexibilă în interogări și scalare. Recomandată pentru aplicații simple în timp real (stare online, chat-uri simple).
| Caracteristică | Cloud Firestore | Firebase Realtime DB |
|---|---|---|
| Model de date | Colecții → Documente | Arbore JSON |
| Interogări | Complexe (filtrare, sortare, limite) | Simple (după cheie) |
| Scalare | Automată | Partiționare manuală |
| Mod offline | Da (cache persistent) | Da |
| Preț | Per operații citire/scriere | Per trafic + stocare |
Stocarea tokenurilor, parolelor și cheilor de criptare necesită depozite protejate speciale.
Android Keystore este un depozit de sistem pentru chei criptografice. Cheile sunt stocate într-un mediu hardware (TEE — Trusted Execution Environment), inaccesibil aplicațiilor și sistemului de operare. Suportă generarea de chei, criptare și semnare. Android 9+ include StrongBox Keymaster (cip dedicat).
Keychain Services este un depozit securizat iOS pentru parole, chei și certificate. Datele sunt criptate folosind Secure Enclave hardware. Keychain suportă niveluri de accesibilitate: Always, WhenUnlocked, WhenUnlockedThisDeviceOnly, AfterFirstUnlock.
EncryptedSharedPreferences este un wrapper peste SharedPreferences cu criptare chei și valori prin AES256-GCM și HKDF. Implementat în biblioteca AndroidX Security. Recomandat pentru stocarea tokenurilor și setărilor sensibile.
La IT Sectr, folosim Android Keystore + EncryptedSharedPreferences pentru stocarea tokenurilor de reîmprospătare și cheilor biometrice. Pe iOS, folosim Keychain cu nivelul kSecAttrAccessibleWhenUnlockedThisDeviceOnly pentru securitate maximă.
Pentru stocarea fișierelor (imagini, videoclipuri, documente), platformele mobile oferă mai multe tipuri de stocare.
Android face distincție între Internal Storage (/data/data/pachet/ — stocare privată) și External Storage (card SD sau partiție emulată). Cache Directory este stocare temporară pe care sistemul o poate curăța. Scoped Storage (Android 10+) restricționează accesul la External Storage — aplicațiile văd doar propriile fișiere sau fișiere prin MediaStore/SAF.
iOS oferă Documents Directory (backup iCloud, date persistente), Library/Caches (fișiere temporare, fără backup) și Tmp Directory (temporare, pot fi curățate). Utilizați NSFileManager pentru lucrul cu sistemul de fișiere. iOS 11+ suportă File Provider pentru fișiere cloud.
Serializarea convertește obiectele într-un format pentru transmitere sau stocare. Deserializarea este procesul invers.
JSON (JavaScript Object Notation) este cel mai popular format: lizibil, flexibil, acceptat de toate platformele. XML este mai strict, utilizat în sisteme moștenite. Protobuf (Protocol Buffers) este un format binar de la Google: de 3-10 ori mai compact decât JSON, parsare mai rapidă, cu schemă strictă. Folosit pentru sisteme cu încărcare mare și microservicii.
JSONSerialization este API-ul încorporat pentru lucrul cu JSON. Codable (Encodable/Decodable) este un protocol Swift modern pentru serializare automată în JSON, Property List și alte formate.
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)
Pentru Flutter și React Native există biblioteci de stocare eficiente proprii.
Hive este un depozit cheie-valoare ușor și rapid pentru Flutter. Nu necesită cod nativ (Dart pur), suportă tipizarea prin TypeAdapter și funcționează în izolate. Ideal pentru cache, setări și volume mici de date.
ObjectBox este o bază de date încorporată de înaltă performanță pentru Flutter, Android și iOS. Este de 10+ ori mai rapidă decât SQLite, folosește o structură de fișier plată pentru un overhead minim. Suportă relații, interogări și abonamente reactive (ObjectBox Dart).
Drift este o bibliotecă SQLite reactivă pentru Flutter și Dart. Oferă interogări tip-securizate, migrări, funcții DAO și suport Stream (actualizări reactive). Drift este alegerea principală pentru proiectele Flutter care necesită SQLite.
Întrebări frecvente
Alegerea depinde de platformă: Room (Android) este biblioteca oficială bazată pe SQLite cu verificarea interogărilor în timpul compilării. Core Data (iOS) este framework-ul Apple cu un graf de obiecte. Pentru proiecte cross-platform, Realm sau SQLite prin ORM sunt potrivite.
SharedPreferences este o implementare veche cu acces sincron și risc ANR. DataStore (Jetpack) este un înlocuitor modern bazat pe Kotlin Coroutines și Flow, care suportă asincronitate, tipizare și protecție împotriva erorilor.
Android: EncryptedSharedPreferences sau Android Keystore. iOS: Keychain Services cu accesibilitatea WhenUnlockedThisDeviceOnly. Pentru date critice, utilizați Secure Enclave (iOS) și Keystore hardware (Android) cu biometrie.
Cloud Firestore este o bază de date NoSQL de la Firebase cu sincronizare în timp real, mod offline și scalare automată. Potrivită pentru chat-uri, fluxuri de știri și proiecte care necesită sincronizare între dispozitive.
Flutter: Hive (cheie-valoare rapid), Floor (ORM SQLite), Drift (Moor, SQLite reactiv), ObjectBox (bază de date încorporată de înaltă performanță). React Native: Realm, WatermelonDB (încărcare lentă) și AsyncStorage (analog SharedPreferences).
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.