A mobilfejlesztésben az adatkezelés, a gyorsítótárazás és a szinkronizáció három kulcsfontosságú szempont, amelyek meghatározzák az alkalmazás teljesítményét és megbízhatóságát. A Google Android Architecture Guide szerint a megfelelő adatkezelési architektúra közvetlenül befolyásolja a válaszidőt és a felhasználói élményt. A Repository minta egységes hozzáférési pontot biztosít az összes adatforráshoz.
Főbb Pontok
A Repository minta egy architekturális megközelítés, ahol egyetlen repository osztály kezeli az összes adatműveletet, elvonatkoztatva a távoli REST API-kat és a helyi tárolást (Room vagy SwiftData). Az adatkezelésnek ez a módja lehetővé teszi az alkalmazás számára, hogy először a Memory Cache-ből vagy Disk Cache-ből szerezze be az információkat, majd a hálózatból, csökkentve a válaszidőt. A mobilfejlesztésben a Repository a Google és az Apple ajánlásainak köszönhetően de facto szabvánnyá vált.
A Remote Data Source HTTP-kéréseken keresztül naprakész információkat szolgáltat a szerverről. Local Data Source a helyi tárolás az eszközön, Androidon Room-on, iOS-en SwiftData-n keresztül megvalósítva. A repository mindkét forrást kombinálja: először a helyi gyorsítótárat ellenőrzi, és adatok hiányában a távoli API-tól kér. Az adatkezelésnek ez a szervezése lehetővé teszi az alkalmazás számára, hogy offline módban működjön, és csökkenti a szerver terhelését.
class UserRepository(
private val remoteDataSource: UserRemoteDataSource,
private val localDataSource: UserLocalDataSource
) {
suspend fun getUsers(): List<User> {
localDataSource.getCachedUsers()?.let { return it }
val users = remoteDataSource.fetchUsers()
localDataSource.cacheUsers(users)
return users
}
}
class UserRepository {
private let remote: UserRemoteDataSource
private let local: UserLocalDataSource
func getUsers() async throws -> [User] {
if let cached = await local.getCached() { return cached }
let users = try await remote.fetch()
await local.save(users)
return users
}
}
LRU Cache (Least Recently Used) egy gyorsítótárazási algoritmus, ahol a korlát elérésekor a leghosszabb ideje nem használt elem kerül eltávolításra. Mobilalkalmazásokban az LRU Cache-t képekhez, API-válaszokhoz és szerializált objektumokhoz használják. A megfelelő adatgyorsítótárazás csökkenti a hálózati kérések számát és felgyorsítja a tartalom betöltését. A gyorsítótár a mobilalkalmazásokban elengedhetetlen összetevő a magas teljesítményhez.
A Memory Cache RAM-ban tárolja az adatokat — a hozzáférés rendkívül gyors, de a kapacitást az alkalmazás heap mérete korlátozza. Disk Cache a fájlrendszerbe menti az információkat — lassabb, de többet tárolhat és a munkamenetek között is megmarad. Az optimális stratégia a mobilfejlesztésben a kétszintű gyorsítótár: Memory Cache a forró adatokhoz és Disk Cache a hideg adatokhoz. Az adatkezelés során először az első szintű gyorsítótár a memóriában, majd a második szintű gyorsítótár a lemezen kerül ellenőrzésre.
class MemoryCache<K, V>(
private val maxSize: Int = 100
) {
private val cache = LinkedHashMap<K, V>(0, 0.75f, true)
fun get(key: K): V? = cache[key]
fun put(key: K, value: V) {
if (cache.size >= maxSize) {
cache.remove(cache.keys.first())
}
cache[key] = value
}
}
TTL gyorsítótár (Time To Live) automatikusan eltávolít egy bejegyzést meghatározott időintervallum után — alkalmas API-adatokhoz. Eseményvezérelt érvénytelenítés a gyorsítótár törlésekor push értesítés érkezik a változásokról. Mobilalkalmazásokban a gyorsítótárazási stratégia kiválasztása az adattípustól függ: a képeket hosszú ideig gyorsítótárazzák, míg a hírfolyam gyakori érvénytelenítést igényel. Az Androidon a Coil és az iOS-en a Kingfisher már beépítette az LRU Cache-t a képekkel való munkához.
Offline Queue egy adatstruktúra, amely a felhasználói műveleteket (létrehozás, frissítés, törlés) helyi adatbázisban tárolja, amikor az eszköz offline. A kapcsolat helyreállításakor a Sync Manager szekvenciálisan alkalmazza ezeket a műveleteket a szerverre. Ez az adatszinkronizációs típus biztosítja, hogy egyetlen változás se vesszen el ideiglenes hálózati kiesés során. A mobilfejlesztésben az Offline Queue kritikus összetevő a bizonytalan kapcsolattal rendelkező alkalmazások számára.
A sor egy Room vagy SwiftData táblára épül a következő mezőkkel: művelet típusa, JSON kérés törzse, időbélyeg és állapot. Sync Manager egy háttérszolgáltatás, amely feldolgozza a függőben lévő műveleteket, elküldi a szervernek, frissíti az állapotot és eltávolítja a sikeres bejegyzéseket. Az Androidon WorkManager-en vagy iOS-en BGTaskScheduler-en keresztüli adatszinkronizáció az eszköz újraindítása után is folytatódik. Az Offline Queue használata a megfelelő adatkezeléssel együtt zökkenőmentes felhasználói élményt biztosít.
@Entity
data class SyncOperation(
@PrimaryKey val id: Long,
val endpoint: String,
val method: String,
val body: String,
val createdAt: Long
)
class SyncManager(
private val dao: SyncOperationDao,
private val api: ApiService
) {
suspend fun syncPending() {
dao.getPendingOperations().forEach { op ->
try {
api.execute(op.endpoint, op.method, op.body)
dao.delete(op.id)
} catch (e: Exception) {
// retry on next cycle
}
}
}
}
Exponenciális várakozás az újrapróbálkozások között (1mp, 2mp, 4mp, 8mp) védi a szervert a hirtelen túlterheléstől és megakadályozza a végtelen újrapróbálkozásokat. Az 5 próbálkozás korlátja megakadályozza a sor túlcsordulását. Az adatszinkronizáció a mobilalkalmazásokban szerveroldali idempotencia támogatással lehetővé teszi a biztonságos újrapróbálkozást, elkerülve a duplikációkat. Ez különösen fontos a pénzügyi tranzakciók és rendelések esetében.
Conflict Resolution stratégiák halmaza azokra a helyzetekre, amikor ugyanazokat az adatokat különböző eszközökön egyidejűleg módosítják. Az alapvető adatszinkronizáció megközelítés választását igényli: Last-Write-Wins (az utolsó írás nyer), verziókezelés (a magasabb verzió nyer) vagy kézi feloldás. Összetett forgatókönyvekben CRDT (Conflict-Free Replicated Data Types) használatos, amely garantálja az adatok matematikai konvergenciáját.
A Last-Write-Wins a legegyszerűbb megvalósítani, de elveszítheti a felhasználói változtatásokat. Version Vector — minden rekord tárol egy verziószámot és eszközazonosítót; konfliktus akkor keletkezik, ha a verziók nem egyeznek. A CRDT a legmegbízhatóbb, de összetett stratégia: az adatok matematikailag egyetlen állapotba konvergálnak központi koordinátor nélkül. A CRDT-alapú adatszinkronizációt mobilalkalmazásokban a Google Docs együttműködő szerkesztésében és a Notion jegyzetszinkronizációjában használják.
Amikor egy alkalmazás frissül, a helyi adatbázis szerkezete megváltozik: oszlopok, táblák, indexek kerülnek hozzáadásra. Schema Migration a meglévő adatbázis új sémává alakításának folyamata adatvesztés nélkül. A Room támogatja a migrációkat a Migration osztályon keresztül régi és új verzióval. A SwiftData a VersionedSchema-t használja a változások leírására. Az alkalmazásverziók közötti megfelelő adatszinkronizáció megköveteli, hogy a migrációkat idempotens módon teszteljék.
val migration1to2 = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE users ADD COLUMN avatar_url TEXT")
}
}
@Database(
entities = [User::class],
version = 2
)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
enum ConflictStrategy {
case lastWriteWins
case versionVector
case crdt
}
struct VersionedDocument {
let id: String
let version: Int
let data: Data
let editedBy: String
func resolve(with remote: VersionedDocument) -> VersionedDocument {
return version >= remote.version ? self : remote
}
}
Room a Google könyvtára helyi tároláshoz Androidon, az SQLite-ra épülve, és annotációkat biztosít deklaratív lekérdezésleírásokhoz. A SwiftData az Apple keretrendszere iOS, macOS, watchOS és visionOS rendszerekhez, a Core Data utódja tömör Swift Macro szintaxissal. Mindkét eszköz megoldja az adatok kezelését az eszközön, de eltérő megközelítéssel a kód szervezéséhez. A gyorsítótár mobilalkalmazásokban gyakran pontosan ezekre a technológiákra épül.
A Room @Entity annotációkat használ a táblákhoz és @Dao-t a lekérdezésekhez. DAO az összes SQL-műveletet beágyazza fordítási idő ellenőrzéssel — az SQL szintaktikai hibák a futás előtt felderítésre kerülnek. A Type Converter az összetett típusokat (Date, List) SQLite primitívekké alakítja. A modern adatkezelés Android-alkalmazásokban a Room + Flow köré épül, reaktív UI-frissítéseket biztosítva, amikor a gyorsítótár vagy a helyi adatbázis megváltozik.
SwiftData a @Model makrót használja entitások meghatározásához és @Query-t az adatok megfigyeléséhez. A keretrendszer automatikusan nyomon követi a függőségeket és frissíti a felületet a változásoknál. A séma migráció a VersionedSchema-t használja, amely leírja az összes verziót. A SwiftData és a szerver közötti adatszinkronizáció egy egyéni Sync Manager segítségével valósul meg, amely feliratkozik a frissítésekre a @Query segítségével.
@Model
final class UserModel {
var id: String
var name: String
var email: String
var updatedAt: Date
init(id: String, name: String, email: String) {
self.id = id
self.name = name
self.email = email
self.updatedAt = Date()
}
}
| Szempont | Room | SwiftData |
|---|---|---|
| Platform | Android | Apple (iOS, macOS, visionOS) |
| Alap | SQLite | SQLite (Core Data verem) |
| Szintaxis | Kotlin annotációk | Swift Macro |
| Migrációk | Migration osztály | VersionedSchema |
| Reaktivitás | Flow / LiveData | @Query property wrapper |
| Platformfüggetlen | Csak Android | Csak Apple |
Gyakori Kérdések
LRU Cache egy gyorsítótárazási algoritmus, amely a korlát elérésekor a legrégebben használt elemet távolítja el. Képek és API-adatok gyorsítótárazására használják mobilalkalmazásokban.
Offline Queue a felhasználói műveleteket helyi adatbázisba menti, ha nincs hálózat. A Sync Manager végrehajtja azokat a kapcsolat helyreállításakor, biztosítva a változások szerverre juttatását.
Conflict Resolution stratégia a konfliktusok feloldására adatszinkronizáció során. Fő megközelítések: Last-Write-Wins, Version Vector és CRDT elosztott rendszerekhez.
Android esetén válassza a Room-ot — egy érett könyvtár fordítási idejű SQL-ellenőrzéssel. iOS esetén — SwiftData deklaratív szintaxissal. Platformfüggetlen projektekhez az SQLDelight vagy a Realm lenne alkalmas.
Az optimális adatszinkronizáció kritikus műveletek esetén minden változásnál, a többinél háttérben 15–30 percenként történik. Azonnali kézbesítéshez használjon push értesítéseket.
Összefoglalá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.