SQLite — ayrıca server prosesi olmadan işləyən və bütün verilənlər bazasını cihazda bir faylda saxlayan quraşdırılmış relyasiyalı verilənlər bazasıdır. Sıfır konfiqurasiya, kitabxananın kiçik ölçüsü və SQL-in tam dəstəyi sayəsində, SQLite mobil tətbiqlərdə lokal verilənlərin saxlanması üçün standart halına gəldi. SQLite Consortium (2025) məlumatlarına görə, bu VTİS iOS və Android-dəki hər smartfon da daxil olmaqla, 4 milyarddan çox cihazda istifadə olunur.
Başlıca məqamlar
SQLite — ayrıca server olmadan relyasiyalı VTİS həyata keçirən C dilində kitabxanadır. O, birbaşa tətbiqin içinə yerləşdirilir, məlumatları cihazın fayl sistemindəki adi fayldan oxuyur və yazır. Kitabxananın ölçüsü təxminən 600 KB təşkil edir ki, bu da SQLite-i ən yüngül tam funksiyalı SQL verilənlər bazası edir.
SQLite SQL:1999 standartının böyük hissəsini, o cümlədən JOIN, alt sorğular, triggerlər, görünüşlər, indekslər və pəncərə funksiyalarını dəstəkləyir. Məhdudiyyətlər ALTER TABLE-a (məhdud dəstək) və tam RIGHT/FULL OUTER JOIN-ə aiddir. Buna baxmayaraq, mobil tətbiqlər üçün SQLite-in funksionallığı lokal saxlama hallarının 99%-də kifayətdir.
Stack Overflow (2025) tərtibatçı sorğusuna görə, SQLite quraşdırılmış həllər üçün ən populyar verilənlər bazasıdır və MySQL və PostgreSQL-dən sonra bütün VTİS-lər arasında populyarlıqda üçüncü yeri tutur. Mobil inkişafda SQLite hər tətbiqdə — birbaşa və ya örtüklər vasitəsilə istifadə olunur.
Zero-configuration — SQLite quraşdırma, icazələrin konfiqurasiyası, istifadəçilərin yaradılması və ya xidmətin işə salınmasını tələb etmir. Kitabxana layihəyə qoşulur və verilənlər bazası bir funksiyanı çağırmaqla yaradılır. Bu, serverin quraşdırılması, portların konfiqurasiyası və istifadəçilərin tənzimlənməsini tələb edən müştəri-server VTİS-ləri ilə müqayisədə yerləşdirməni köklü şəkildə asanlaşdırır.
SQLite verilənlər bazası faylı köçürülə, təhlil edilə, şəbəkə üzərində göndərilə və ya ehtiyat nüszədən bərpa edilə bilən adi platformalararası fayldır. Fayl formatı API səviyyəsində sabittir: 2004-cü ildə yaradılmış SQLite 3 faylları kitabxananın cari versiyası ilə açılır ki, bu da məlumatların uzunmüddətli uyğunluğuna zəmanət verir.
SQLite-in arxitekturası səkkiz virtual maşından ibarətdir: Tokenizer, Parser, Code Generator, VM, B-Tree, Pager, OS Interface və Utilities. SQL sorğusu Tokenizer (tokenlərə bölmə), Parser (AST qurma), Code Generator (bayt koduna çevirmə) mərhələlərindən keçir və B-Tree və Pager vasitəsilə məlumat səhifələrini oxuyan virtual maşında icra olunur.
SQLite cədvəlləri və indeksləri saxlamaq üçün B-Tree istifadə edir. Hər cədvəl ayrı bir B-Tree kimi saxlanılır, burada yarpaq düymlər məlumat sətrlərini ehtiva edir. İndekslər də B-Tree kimi saxlanılır, lakin yarpaqlarda açarlarla. Pager fayldan səhifələrin (standart olaraq 4096 bayt) yaddaşa yüklənməsini idarə edir, jurnal və ya WAL vasitəsilə ACID əməliyyatlarını təmin edir.
WAL (Write-Ahead Logging) — mobil tətbiqlər üçün tövsiyə olunan rejim. Dəyişikliklər əvvəlcə ayrıca WAL faylına yazılır, sonra dövri olaraq əsas verilənlər bazasına köçürülür. WAL eyni vaxtda verilənlər bazasından oxumağa (köhnə məlumatlar) və ona yazmağa (WAL vasitəsilə) imkan verir ki, bu da çoxiplikli tətbiqlərin performansını artırır. Standart jurnal (rollback journal) yazma zamanı oxumanı bloklayır.
| Parametr | Rollback Journal | WAL (Write-Ahead Logging) |
|---|---|---|
| Yazma zamanı oxuma | Bloklanır | İcazə verilir (köhnə məlumatları oxuyur) |
| Yazma performansı | Orta | Yüksək (ardıcıl WAL yazısı) |
| Disk istifadəsi | Az (yalnız geri qaytarma jurnalı) | Çox (WAL + əsas VTİS) |
| Nasazlıqdan bərpa | Son yoxlama nöqtəsinə geri qayıtma | WAL-dan bərpa (məlumatlar itmir) |
| Tövsiyə | Tek iplikli ssenarilər üçün | Tipik mobil tətbiqlər üçün |
Rejimlər arasında keçid bir SQL sorğusu ilə həyata keçirilir: PRAGMA journal_mode=WAL. Fon sinxronizasiyası və eyni vaxtda məlumatları oxuyan UI ipliyi olan mobil tətbiqlər üçün WAL daha yaxşı performans və interfeysin bloklanmamasını təmin edir.
SQLite lokal verilənlərin saxlanması üçün yeganə seçim deyil, lakin ən universal olandır. Realm yaddaşdakı obyektlərə birbaşa çıxış üçün daha yüksək sürət təklif edir, lakin öz NoSQL formatından istifadə edir və daha böyük kitabxana ölçüsünə malikdir. iOS-da Core Data SQLite üzərində ORM qatıdır, obyekt qrafının idarə edilməsi və əməliyyatların ləğvini əlavə edir.
Tətbiqlərin əksəriyyəti üçün SQLite proqnozlaşdırıla bilən performansı, sıfır vendor lock-in və zamana qarşı sınaqdan keçirilmiş sabitliyi sayəsində optimal seçim olaraq qalır. Realm və Core Data mürəkkəb obyekt qrafı, reaktiv sorğular və ya cihazlar arası sinxronizasiya tələb edən layihələrdə əsaslandırılır.
| Xüsusiyyət | SQLite | Realm | Core Data |
|---|---|---|---|
| VTİS növü | Relyasiyalı (SQL) | NoSQL (obyekt yönümlü) | ORM (SQLite üzərində) |
| Kitabxana ölçüsü | ~600 KB | ~4 MB | Apple SDK-ya daxildir |
| Performans | Orta | Yüksək (yaddaşda obyektlər) | Orta (ORM yükü) |
| Platformalar | iOS, Android, Web, Desktop | iOS, Android, Node.js | iOS, macOS |
| Vendor lock-in | Yox (açıq standart) | Orta (öz formatı) | Yüksək (yalnız Apple) |
SQLite, Realm və Core Data arasında seçim platformadan, obyekt modeli tələblərindən və sinxronizasiya strategiyasından asılıdır. Platformalararası layihələr (KMP, Flutter) üçün SQLite məlumat modelində dəyişiklik olmadan bütün hədəf platformalarda işləyən yeganə universal seçim olaraq qalır.
Room — SQLite üzərində ORM qatı təmin edən Android Jetpack kitabxanasıdır. Room annotasiya olunmuş DAO interfeyslərindən avtomatik olaraq SQL sorğuları yaradır, sorğuların düzgünlüyünü kompilasiya mərhələsində yoxlayır və sxem dəyişikliyi zamanı verilənlər bazası miqrasiyalarını dəstəkləyir. Room Android-də SQLite ilə işləməyin tövsiyə olunan üsuludur.
SQLiteOpenHelper — ORM olmadan SQLite-i birbaşa idarə etmək üçün aşağı səviyyəli API-dir. Sinif verilənlər bazasının yaradılmasını, açılmasını və yenilənməsini idarə edir. SQLiteOpenHelper sadə SQL sorğuları olan və ya Room abstraksiyası olmadan SQL məntiqi üzərində tam nəzarət tələb edən layihələr üçün uyğundur.
Varlıq Room-da @Entity ilə, DAO isə @Dao ilə annotasiya olunur. Room annotasiya olunmuş metodları SQL sorğularına çevirir: @Insert INSERT yaradır, @Query — göstərilmiş SQL ilə SELECT. Miqrasiyalar köhnə və yeni sxem versiyasını göstərən Migration vasitəsilə əlavə edilir. Room SQL-i kompilasiya mərhələsində yoxlayır ki, bu da istehsalatda sintaksis səhvlərini aradan qaldırır.
@Entity
data class User(
@PrimaryKey val id: Long,
val name: String,
@ColumnInfo(name = "created_at")
val createdAt: Long
)
@Dao
interface UserDao {
@Query("SELECT * FROM user ORDER BY name ASC")
suspend fun getAllUsers(): List<User>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertUser(user: User)
@Query("DELETE FROM user WHERE id = :id")
suspend fun deleteUser(id: Long)
}
Room daxili RoomDatabase vasitəsilə SQLite-ə icra zamanı sorğuları ehtiva edən UserDao_Impl implementasiyasını avtomatik yaradır. Korutinlər (suspend) sayəsində DAO metodları UI-ni bloklamadan fon ipliyində asinxron şəkildə icra olunur. @Query-də Flow qaytaran tiplər cədvəl dəyişərkən nəticəni avtomatik yeniləyir.
FMDB — SQLite C API üzərində Objective-C örtüyü, tarixən iOS üçün ilk məşhur kitabxanadır. Sorğuları icra etmək və nəticələri əldə etmək üçün FMDatabase və FMResultSet obyektlərini təqdim edir. FMDB sadə və minimaldir, lakin Swift-ə xas konstruksiyaları — optionallar, Codable, async/await — dəstəkləmir.
GRDB — SQLite ilə işləmək üçün müasir Swift kitabxanasıdır. Type-safe API, Codable dəstəyi, Combine Publishers, async/await, miqrasiyalar və real vaxt rejimində dəyişikliklərin izlənməsini təmin edir. GRDB Swift Concurrency ilə tam inteqrasiya və daha yaxşı kod oxunaqlılığı sayəsində yeni Swift layihələri üçün üstünlük təşkil edir.
GRDB cədvəlləri FetchableRecord və TableRecord protokollarına uyğun Record sinifləri vasitəsilə təyin edir. Sorğular xam SQL ilə deyil, Swift-də type-safe sintaksislə yazılır. GRDB hçemçinin sxemin versiyalaşdırılması və tətbiq versiyaları arasında miqrasiyalar üçün DatabaseMigrator-u dəstəkləyir.
struct User: Codable, FetchableRecord, TableRecord {
var id: Int64
var name: String
var createdAt: Date
}
let dbPool = try DatabasePool(path: dbPath)
var migrator = DatabaseMigrator()
migrator.registerMigration("v1") { db in
try db.create(table: "user") { t in
t.autoIncrementedPrimaryKey("id")
t.column("name", .text).notNull()
t.column("createdAt", .datetime).notNull()
}
}
let users = try await dbPool.read { db in
try User.order(Column("name")).fetchAll(db)
}
DatabasePool paralel oxuma üçün SQLite WAL rejimindən istifadə edir. Çoxlu oxucu eyni vaxtda verilənlər bazasına müraciət edə bilər, bir yazıçı isə WAL vasitəsilə məlumatları yeniləyir. GRDB əl ilə sinxronizasiya olmadan istənilən iplikdən bazaya thread-safe çıxışı təmin edərək əlaqələri və əməliyyatları avtomatik idarə edir.
İndekslər — SQLite sorğularını sürətləndirməyin ən təsirli üsuludur. İndeks WHERE, JOIN və ORDER BY-də iştirak edən sütunlarda yaradılır. 100 000 qeydi olan cədvəl üçün indekslənmiş sütun üzrə axtarış saniyələr əvəzinə millisaniyələr çəkir. Lakin indekslər INSERT və UPDATE-i yavaşlatdır, ona görə də onların sayı yazma tezliyi ilə balanslaşdırılmalıdır.
Toplu yerləşdirmə (batch insert) bir əməliyyat çərçivəsində kütləvi məlumat yükləməsini köklü şəkildə sürətləndirir. 1000 qeydin tək-tək yerləşdirməsi təxminən 1 saniyə əlavə yük verir. Eyni 1000 qeydin bir əməliyyatda yerləşdirməsi — təxminən 5–10 millisaniyə. Fərq onunla izah olunur ki, hər ayrıca INSERT diskə sinxron yazma ilə yeni əməliyyat yaradır.
PRAGMA — kitabxananın davranışını konfiqurasiya etmək üçün SQLite əmrləridir. Əsas optimallaşdırma PRAGMA-ları: PRAGMA synchronous=NORMAL (fsync tezliyini azaldır), PRAGMA cache_size=-8000 (8 MB keş ayırır), PRAGMA temp_store=MEMORY (müvəqqəti cədvəllər yaddaşda). Böyük həcmli məlumatları olan mobil tətbiqlər üçün bu PRAGMA-ların kombinasiyası sorğuları 2–3 dəfə sürətləndirir.
Digər vacib optimallaşdırma — SQL sorğularının öncədən kompilasiyası (prepared statements). Əgər sorğu dəfələrlə icra olunursa (məsələn, 10 000 sətrin yerləşdirməsi), SQL-in bir dəfə kompilasiyası və sonra statement-in istifadəsi CPU yükünü 30–50% azaldır. Room və GRDB prepared statements-ləri avtomatik keşləyir, lakin SQLite C API-dən birbaşa istifadə edərkən kompilasiya əl ilə aparılmalıdır.
class UserRepository(private val db: RoomDatabase) {
suspend fun insertBatch(users: List<User>) {
db.withTransaction {
users.chunked(500).forEach { batch ->
batch.forEach { user ->
insertUser(user)
}
}
}
}
}
withTransaction ilə toplu yerləşdirmə bütün INSERT-lərin bir əməliyyat çərçivəsində icra olunmasına zəmanət verir. Alt toplulara bölmə (chunked) digər iplikləri uzun müddət bloklaya biləcək çox böyük bir əməliyyatın qarşısını alır. Fon sinxronizasiyası üçün 500 qeydlik alt toplu ölçüsü sürət və UI həssaslığının optimal balansını təmin edir.
Tez-tez verilən suallar
Bəli, SQLite WAL rejimində çoxiplikli çıxışı dəstəkləyir. Bir neçə iplik eyni vaxtda məlumatları oxuya bilər, lakin yalnız biri yaza bilər. Room və GRDB sinxronizasiyanı avtomatik idarə edir. Rollback journal rejimində (standart) verilənlər bazası hər yazma zamanı tamamilə bloklanır.
SQLite məhdudiyyəti — 281 TB (nəzəri maksimum). Praktikada verilənlər bazasının ölçüsü cihazın mövcud yaddaşı ilə məhdudlaşır. Mobil tətbiqlər üçün rahat ölçü 1–2 GB-a qədərdir. 2 GB-dan böyük verilənlər bazaları ehtiyat nüszəni, App Store vasitəsilə yeniləməni yavaşlatır və RAM istehlakını artırır.
SQLite standart olaraq məlumatları şifrələmir — fayla çıxışı olan istənilən proses onları oxuya bilər. Şifrələmə üçün SQLCipher (AES-256 ilə genişləndirmə), EncryptedDatabase ilə Room (Android) və ya iOS-da Encrypted Core Data istifadə edin. Şifrələmə məlumatların oxunmasına və yazılmasına 5–15% əlavə yük gətirir.
SQLite server prosesi tələb etməyən quraşdırılmış (embedded) kitabxanadır. MySQL ayrıca serveri, istifadəçiləri, giriş hüquqları və şəbəkə protokolu olan müştəri-server VTİS-dir. SQLite verilənlər bazasını bir faylda saxlayır, MySQL — server tərəfindən idarə olunan bir neçə faylda. SQLite daha sadə və yüngüldür, MySQL daha güclü və miqyaslana biləndir.
Miqrasiya üçün SQLite-də ALTER TABLE (sütun əlavə etmə) və ya məlumatları köçürmə və köhnəni silməklə yeni cədvəl yaratma istifadə edin. Room bu prosesi Migration sinifləri vasitəsilə avtomatlaşdırır: startVersion, endVersion və sxemi dəyişdirmək üçün SQL sorğularını qeyd edin. GRDB və FMDB oxşar DatabaseMigrator təmin edir.
Nəticə
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.
Həm də oxuyun