Stocarea permanentă a datelor asigură păstrarea informațiilor utilizatorului între sesiunile de lucru ale aplicației mobile. Fără această tehnologie, fiecare pornire a programului ar începe de la zero — setările, istoricul și fișierele încărcate s-ar pierde la închidere. Conform datelor Google Developers, 2024, peste 90% din aplicațiile mobile folosesc cel puțin un mecanism de stocare permanentă pentru salvarea datelor utilizatorului și a stării interfeței.
Principalele puncte
Data Persistence — este capacitatea aplicației de a salva date în memoria nevolatilă a dispozitivului. În dezvoltarea mobilă, stocarea permanentă include baze de date, sistemul de fișiere, setări și cache. Fiecare mecanism are propriile caracteristici de performanță, securitate și volum de informații stocate.
Datele temporare există doar în memoria RAM și se pierd la terminarea procesului. Acestea includ starea ecranului, calcule temporare și cache de imagini. Datele permanente sunt scrise în sistemul de fișiere sau baza de date și rămân accesibile după repornirea aplicației. Acestea includ setările utilizatorului, token-uri de autorizare, istoricul operațiunilor și conținutul descărcat.
La alegerea metodei de salvare, dezvoltatorul evaluează mai mulți factori. Tipul datelor determină structura de stocare: setări simple — SharedPreferences sau DataStore, înregistrări structurate — SQLite sau Room, fișiere — File Storage. Volumul datelor influențează performanța: bazele de date sunt optimizate pentru mii de înregistrări, iar fișierele — pentru obiecte binare mari. Securitatea necesită criptarea informațiilor sensibile prin EncryptedSharedPreferences sau SQLCipher.
data class StorageOption(
name: String,
dataType: StorageType,
capacity: Long,
secure: Boolean
)
enum class StorageType {
KEY_VALUE,
RELATIONAL,
FILE
}
SharedPreferences — metoda clasică de stocare a perechilor cheie-valoare pe Android. Această API există de la primele versiuni ale platformei și suportă tipuri primitive: șiruri de caractere, numere, valori booleene. Datele sunt stocate într-un fișier XML în directorul privat al aplicației și sunt accesibile doar procesului său.
Jetpack DataStore — înlocuitorul modern pentru SharedPreferences, construit pe Kotlin Coroutines și Flow. DataStore oferă două variante: Preferences DataStore pentru valori simple și Proto DataStore pentru obiecte tipizate. Spre deosebire de SharedPreferences, DataStore garantează consistența datelor la acces concurent și suportă operații asincrone fără blocarea firului principal.
// SharedPreferences — mod tradițional
val prefs = context
.getSharedPreferences("settings", Context.MODE_PRIVATE)
with (prefs.edit()) {
putString("username", "john_doe")
putInt("score", 1500)
apply()
}
// DataStore — abordare asincronă
val settingsDataStore = context
.createDataStore("settings.pb")
val usernameFlow: Flow<String> = settingsDataStore
.data
.map { it[USERNAME_KEY] ?: "" }
Pe iOS, echivalentul SharedPreferences este UserDefaults — un sistem de stocare a valorilor simple în format Property List. UserDefaults utilizează acces sincron și este potrivit pentru volume mici de date de configurare, dar nu este recomandat pentru stocarea informațiilor sensibile.
SQLite — bază de date relațională încorporată care funcționează în cadrul procesului aplicației fără un server separat. Aceasta este cel mai răspândit DBMS în dezvoltarea mobilă: este utilizată implicit pe ambele platforme. Android include SQLite în SDK, iar iOS — în biblioteca libsqlite3. SQLite suportă SQL standard, tranzacții, indecși și declanșatoare.
Lucrul cu SQLite începe cu crearea schemei bazei de date. Dezvoltatorul definește tabelele, câmpurile și tipurile lor, după care execută operații de inserare, citire, actualizare și ștergere. SQLiteOpenHelper pe Android gestionează crearea și migrarea bazei de date, iar pe iOS se utilizează interfața C sau wrapper-ul FMDB.
// SQLiteOpenHelper pe Android
class DBHelper(context: Context) :
SQLiteOpenHelper(context, "app.db", null, 1) {
override fun onCreate(db: SQLiteDatabase) {
db.execSQL("""
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE
)
""")
}
fun insertUser(name: String, email: String) {
val db = writableDatabase
val values = ContentValues().apply {
put("name", name)
put("email", email)
}
db.insert("users", null, values)
}
}
| Tip de date | SharedPreferences | SQLite | Sistem de fișiere |
|---|---|---|---|
| Tip | cheie-valoare | bază de date relațională | fișiere binare |
| Volum | sute de înregistrări | mii de înregistrări | spațiu disponibil |
| Performanță | ridicată | medie | depinde de dimensiune |
| Utilizare tipică | setări | date structurate | imagini, video |
Room — bibliotecă din suita Jetpack, care oferă un strat ORM peste SQLite. Room elimină munca de rutină de scriere a interogărilor SQL și ContentValues, înlocuindu-le cu adnotări și funcții Kotlin. Compilatorul Room generează implementarea DAO (Data Access Object) în etapa de compilare, ceea ce exclude erorile în sintaxa SQL.
Pentru a conecta Room, trebuie adăugată dependența kapt și adnotată clasa entitate, interfața DAO și clasa bazei de date. RoomDatabase servește ca punct de intrare: prin el se obține DAO și se execută operații cu baza de date. Room suportă Flow pentru interogări reactive, migrări de schemă și verificarea interogărilor la compilare.
@Entity(tableName = "users")
data class User(
@PrimaryKey val id: Int,
@ColumnInfo(name = "full_name") val name: String,
@ColumnInfo val email: String
)
@Dao
interface UserDao {
@Query("SELECT * FROM users")
fun getAll(): Flow<List<User>>
@Insert
suspend fun insert(user: User)
@Delete
suspend fun delete(user: User)
}
@Database(
entities = [User::class],
version = 1
)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
Core Data — framework Apple pentru gestionarea grafului de obiecte și salvarea lor pe disc. Spre deosebire de Room, Core Data nu lucrează cu tabele, ci cu obiecte gestionate (NSManagedObject) care formează o ierarhie de relații. Core Data suportă încărcarea lentă, anularea modificărilor și interogări complexe prin NSFetchRequest.
Baza Core Data o constituie stiva din trei componente: contextul gestionat (NSManagedObjectContext), stocarea persistentă (NSPersistentStoreCoordinator) și modelul de date (NSManagedObjectModel). NSPersistentContainer unește toate componentele într-un singur punct de intrare, simplificând configurarea pentru aplicațiile moderne în Swift.
import CoreData
class PersistenceController {
static let shared = PersistenceController()
let container: NSPersistentContainer
init() {
container = NSPersistentContainer(name: "AppModel")
container.loadPersistentStores { _, error in
if let error = error {
fatalError("Failed: \(error)")
}
}
}
func saveUser(name: String, email: String) {
let context = container.viewContext
let user = User(context: context)
user.name = name
user.email = email
do {
try context.save()
} catch let error {
print("Eroare salvare: \(error)")
}
}
}
Stocarea în fișiere (File Storage) este utilizată pentru salvarea imaginilor, videourilor și documentelor. Android oferă stocare internă (context.filesDir) — privată pentru aplicație, și externă (Environment.getExternalStorageDirectory) — accesibilă altor aplicații. Pe iOS, fișierele sunt salvate în directoarele Documents și Library, iar Library/Caches este destinată cache-ului care nu face obiectul backup-ului în iCloud. Pentru lucrul cu fișiere, ambele platforme oferă File API și operații de citire și scriere în flux. Bibliotecile moderne precum Coil și SDWebImage adaugă un strat de cache, combinând stocarea în fișiere cu memoria RAM pentru performanță optimă.
Pe Android, alternativa la Core Data ca complexitate și funcționalitate este Realm — o bază de date orientată pe obiecte care lucrează direct cu modelele fără un strat SQL. Realm este mai rapid decât SQLite în operațiile de citire și suportă obiecte live care actualizează automat UI la modificarea datelor.
Întrebări frecvente
Data Persistence — sunt mecanismele de salvare a datelor în memoria nevolatilă a dispozitivului, asigurând accesibilitatea acestora după repornirea aplicației. Acestea includ baze de date, stocare în fișiere și sisteme de setări.
Room este un strat ORM peste SQLite care elimină scrierea manuală a interogărilor SQL și a ContentValues. Room verifică interogările SQL la compilare, suportă Kotlin Coroutines și Flow și generează automat codul de acces la date.
SharedPreferences este potrivit pentru stocarea unui volum mic de date simple: setări ale aplicației, flag-uri, identificatori și preferințe ale utilizatorului. Pentru date complexe sau structurate, este mai bine să folosiți Room sau DataStore.
Core Data — framework Apple pentru gestionarea grafului de obiecte. Acesta oferă lucrul cu obiecte gestionate, urmărirea modificărilor, încărcarea lentă și salvarea automată în stocarea persistentă (SQLite, XML sau format binar).
Alegerea depinde de complexitatea datelor: pentru setări — DataStore sau UserDefaults, pentru înregistrări structurate — Room (Android) sau Core Data (iOS), pentru fișiere — File Storage. Criteriile includ volumul datelor, cerințele de performanță și necesitatea criptării. Combinarea mai multor mecanisme într-o singură aplicație este o practică standard care permite utilizarea optimă a punctelor forte ale fiecărei abordări.
Concluzii
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.
Citiți și