Mobil inkişafda məlumatlarla iş, keşləmə və sinxronizasiya tətbiqin performansını və etibarlılığını müəyyən edən üç əsas aspektdir. Google Android Architecture Guide-a görə, düzgün məlumat idarəetmə arxitekturası cavab sürətinə və istifadəçi təcrübəsinə birbaşa təsir edir. Repository nümunəsi bütün məlumat mənbələrinə vahid giriş nöqtəsi təmin edir.
Əsas Məqamlar
Repository nümunəsi — vahid depo sinfinin bütün məlumat əməliyyatlarını idarə etdiyi, uzaq REST API-ləri və yerli depolama Room və ya SwiftData-nı abstraktlaşdırdığı arxitektura yanaşmasıdır. Məlumatlarla işin bu üsulu tətbiqə əvvəlcə Memory Cache və ya Disk Cache-dən, sonra isə şəbəkədən məlumat almağa imkan verir, cavab müddətini azaldır. Mobil inkişafda Repository Google və Apple-ın tövsiyələri sayəsində de-fakto standarta çevrilmişdir.
Remote Data Source HTTP sorğuları vasitəsilə serverdən cari məlumatı təmin edir. Local Data Source — Android-də Room və ya iOS-da SwiftData vasitəsilə tətbiq edilən cihazdakı yerli depolamadır. Depo hər iki mənbəni birləşdirir: əvvəlcə yerli keşi yoxlayır, məlumat olmadıqda isə uzaq API-dən sorğu edir. Məlumat idarəetmənin bu təşkili tətbiqə oflayn rejimdə işləməyə imkan verir və server yükünü azaldır.
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) — limitə çatdıqda ən uzun müddət ərzində giriş edilməmiş elementin silindiyi keşləmə alqoritmidir. Mobil tətbiqlərdə LRU Cache şəkillər, API cavabları və seriyalaşdırılmış obyektlər üçün istifadə olunur. Düzgün məlumat keşləmə şəbəkə sorğularının sayını azaldır və məzmun yükləməni sürətləndirir. Mobil tətbiqlərdə keş yüksək performans üçün vacib komponentdir.
Memory Cache məlumatları RAM-da saxlayır — giriş son dərəcə sürətlidir, lakin tutum tətbiqin yığın ölçüsü ilə məhdudlaşır. Disk Cache məlumatları fayl sistemində saxlayır — daha yavaşdır, lakin daha çox saxlaya bilir və sessiyalar arasında qalıcıdır. Mobil inkişafda optimal strategiya iki səviyyəli keşdir: isti məlumatlar üçün Memory Cache və soyuq məlumatlar üçün Disk Cache. Məlumatlarla iş zamanı əvvəlcə yaddaşda birinci səviyyəli keş, sonra diskdə ikinci səviyyəli keş yoxlanılır.
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 keşi (Time To Live) müəyyən vaxt intervalından sonra avtomatik olaraq girişi silir — API məlumatları üçün uyğundur. Hadisə əsaslı etibarsızlaşdırma dəyişikliklər haqqında push bildirişi alındıqda keşi təmizləyir. Mobil tətbiqlərdə keşləmə strategiyasının seçimi məlumat növündən asılıdır: şəkillər uzun müddət keşlənir, xəbər lenti isə tez-tez etibarsızlaşdırma tələb edir. Android-də Coil və iOS-da Kingfisher artıq şəkillərlə iş üçün LRU Cache-i inteqrasiya etmişdir.
Offline Queue — cihaz oflayn olduqda istifadəçi əməliyyatlarını (yaratma, yeniləmə, silmə) yerli verilənlər bazasında saxlayan məlumat strukturudur. Bağlantı bərpa edildikdə, Sync Manager bu əməliyyatları ardıcıl olaraq serverə tətbiq edir. Bu tip məlumat sinxronizasiyası müvəqqəti şəbəkə itkisi zamanı heç bir dəyişikliyin itirilməməsinə zəmanət verir. Mobil inkişafda Offline Queue qeyri-sabit bağlantısı olan tətbiqlər üçün kritik komponentdir.
Növbə Room və ya SwiftData-da bir cədvəl üzərində qurulur və sahələri: əməliyyat növü, JSON sorğu gövdəsi, vaxt damğası və status. Sync Manager — gözləməli əməliyyatları emal edən, serverə göndərən, statusu yeniləyən və uğurlu girişləri silən fon xidmətidir. Android-də WorkManager və ya iOS-da BGTaskScheduler vasitəsilə məlumat sinxronizasiyası cihaz yenidən başladıldıqdan sonra da davam edir. Düzgün məlumat idarəetmə ilə Offline Queue istifadəsi problemsiz istifadəçi təcrübəsi təmin edir.
@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
}
}
}
}
Təkrar cəhdlər arasında eksponensial geriləmə (1s, 2s, 4s, 8s) serveri izdihamdan qoruyur və sonsuz təkrar cəhdlərin qarşısını alır. 5 cəhd həddi növbənin daşmasının qarşısını alır. Server tərəfi idempotentlik dəstəyi ilə mobil tətbiqlərdə məlumat sinxronizasiyası təkrarların qarşısını alaraq təhlükəsiz təkrar cəhdlərə imkan verir. Bu, xüsusilə maliyyə əməliyyatları və sifarişlər üçün vacibdir.
Conflict Resolution — eyni məlumatların müxtəlif cihazlarda eyni anda dəyişdirildiyi hallar üçün strategiyalar toplusudur. Əsas məlumat sinxronizasiyası bir yanaşma seçməyi tələb edir: Last-Write-Wins (son yazı qalib gəlir), versiyalaşdırma (yüksək versiya qalib gəlir) və ya əl ilə həll. Mürəkkəb ssenarilərdə məlumatların riyazi yaxınlaşmasını təmin edən CRDT (Conflict-Free Replicated Data Types) istifadə olunur.
Last-Write-Wins tətbiqi ən sadədir, lakin istifadəçi dəyişikliklərini itirə bilər. Version Vector — hər bir yazı versiya nömrəsi və cihaz identifikatoru saxlayır; versiyalar uyğun gəlmədikdə münaqişə yaranır. CRDT ən etibarlı, lakin mürəkkəb strategiyadır: məlumatlar mərkəzləşdirilmiş koordinator olmadan riyazi olaraq vahid vəziyyətə yaxınlaşır. CRDT əsaslı mobil tətbiqlərdə məlumat sinxronizasiyası Google Docs-da birgə redaktə və Notion qeyd sinxronizasiyasında istifadə olunur.
Tətbiq yeniləndikdə, yerli verilənlər bazası strukturu dəyişir: sütunlar, cədvəllər, indekslər əlavə olunur. Schema Migration — məlumat itkisi olmadan mövcud verilənlər bazasının yeni sxemə çevrilməsi prosesidir. Room köhnə və yeni versiya ilə Migration sinfi vasitəsilə miqrasiyaları dəstəkləyir. SwiftData dəyişiklikləri təsvir etmək üçün VersionedSchema istifadə edir. Tətbiq versiyaları arasında düzgün məlumat sinxronizasiyası miqrasiyaların idempotent şəkildə sınaqdan keçirilməsini tələb edir.
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 — Android-də yerli depolama üçün Google kitabxanası, SQLite üzərində qurulmuş və deklarativ sorğu təsvirləri üçün annotasiyalar təmin edir. SwiftData — iOS, macOS, watchOS və visionOS üçün Apple freymvorku, qısa Swift Macro sintaksisi ilə Core Data-nın varisidir. Hər iki alət cihazda məlumatlarla iş tapşırığını həll edir, lakin kod təşkili üçün fərqli yanaşmalarla. Mobil tətbiqlərdə keş çox vaxt məhz bu texnologiyalar üzərində qurulur.
Room cədvəllər üçün @Entity annotasiyalarından və sorğular üçün @Dao-dan istifadə edir. DAO kompilə zamanı yoxlama ilə bütün SQL əməliyyatlarını inkapsulə edir — SQL sintaksis səhvlər işə salınmadan əvvəl aşkarlanır. Type Converter mürəkkəb tipləri (Date, List) SQLite primitivlərinə çevirir. Android tətbiqlərində müasir məlumat idarəetmə Room + Flow ətrafında qurulur, keş və ya yerli verilənlər bazası dəyişdikdə reaktiv UI yeniləmələri təmin edir.
SwiftData varlıqları təyin etmək üçün makro @Model-dən və məlumatları müşahidə etmək üçün @Query-dən istifadə edir. Freymvork avtomatik olaraq asılılıqları izləyir və dəyişikliklərdə interfeysi yeniləyir. Sxem miqrasiyası bütün versiyaları təsvir edən VersionedSchema istifadə edir. SwiftData və server arasında məlumat sinxronizasiyası @Query vasitəsilə yeniləmələrə abunə olan fərdi Sync Manager vasitəsilə tətbiq edilir.
@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()
}
}
| Meyar | Room | SwiftData |
|---|---|---|
| Platforma | Android | Apple (iOS, macOS, visionOS) |
| Əsas | SQLite | SQLite (Core Data yığını) |
| Sintaksis | Kotlin annotasiyaları | Swift Macro |
| Miqrasiyalar | Migration sinfi | VersionedSchema |
| Reaktivlik | Flow / LiveData | @Query property wrapper |
| Çarpaz platforma | Yalnız Android | Yalnız Apple |
Tez-tez Verilən Suallar
LRU Cache — limitə çatdıqda ən az istifadə edilmiş elementi silən keşləmə alqoritmidir. Mobil tətbiqlərdə şəkillər və API məlumatları üçün istifadə olunur.
Offline Queue şəbəkə olmadıqda istifadəçi əməliyyatlarını yerli verilənlər bazasında saxlayır. Sync Manager bağlantı bərpa edildikdə onları icra edir, dəyişikliklərin serverə çatdırılmasını təmin edir.
Conflict Resolution — məlumat sinxronizasiyası zamanı münaqişələrin həlli strategiyasıdır. Əsas yanaşmalar: Paylanmış sistemlər üçün Last-Write-Wins, Version Vector və CRDT.
Android üçün Room seçin — kompilə zamanı SQL yoxlaması olan yetkin kitabxana. iOS üçün — deklarativ sintaksis ilə SwiftData. Çarpaz platforma layihələri üçün SQLDelight və ya Realm uyğun olacaq.
Optimal məlumat sinxronizasiyası kritik əməliyyatlar üçün hər dəyişiklikdə və qalanları üçün fon rejimində hər 15-30 dəqiqədə bir aparılır. Anında çatdırılma üçün push bildirişlərindən istifadə edin.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.