SQLite — bu alohida server jarayonisiz ishlaydigan va butun ma’lumotlar bazasini qurilmada bitta faylda saqlaydigan o‘rnatilgan relyatsion ma’lumotlar bazasidir. Nol konfiguratsiya, kichik kutubxona hajmi va SQLni to‘liq qo‘llab-quvvatlash tufayli, SQLite mobil ilovalarda mahalliy ma’lumotlarni saqlash uchun standartga aylandi. SQLite Consortium (2025) ma’lumotlariga ko‘ra, ushbu MBT iOS va Android-dagi har bir smartfonni o‘z ichiga olgan holda 4 milliarddan ortiq qurilmalarda qo‘llaniladi.
Asosiy ma’lumotlar
SQLite — bu alohida serversiz relyatsion MBTni amalga oshiradigan C tilidagi kutubxonadir. U to‘g‘ridan-to‘g‘ri ilovaga o‘rnatiladi, qurilmaning fayl tizimidagi oddiy fayldan ma’lumotlarni o‘qiydi va yozadi. Kutubxonaning hajmi taxminan 600 KB ni tashkil etadi, bu SQLite-ni eng yengil to‘liq funksiyali SQL ma’lumotlar bazasiga aylantiradi.
SQLite SQL:1999 standartining katta qismini, jumladan JOIN, pastki so‘rovlar, triggerlar, ko‘rinishlar, indekslar va oyna funksiyalarini qo‘llab-quvvatlaydi. Cheklovlar ALTER TABLE (cheklangan qo‘llab-quvvatlash) va to‘liq RIGHT/FULL OUTER JOIN ga tegishli. Shunga qaramay, mobil ilovalar uchun SQLite funksionalligi mahalliy saqlash holatlarining 99 foizida yetarli.
Stack Overflow (2025) dasturchilar so‘roviga ko‘ra, SQLite o‘rnatilgan echimlar uchun eng ommabop ma’lumotlar bazasi bo‘lib, MySQL va PostgreSQL-dan keyin barcha MBTlar orasida mashhurlik bo‘yicha uchinchi o‘rinni egallaydi. Mobil ishlanmada SQLite har bir ilovada — to‘g‘ridan-to‘g‘ri yoki qoplamalar orqali qo‘llaniladi.
Zero-configuration — SQLite o‘rnatish, ruxsatlarni sozlash, foydalanuvchilar yaratish yoki xizmatni ishga tushirishni talab qilmaydi. Kutubxona loyihaga ulanadi va ma’lumotlar bazasi bitta funksiyani chaqirish orqali yaratiladi. Bu server o‘rnatish, portlarni sozlash va foydalanuvchilarni konfiguratsiya qilishni talab qiladigan mijoz-server MBTlariga nisbatan joylashtirishni tubdan soddalashtiradi.
SQLite ma’lumotlar bazasi fayli — bu nusxalash, tahlil qilish, tarmoq orqali yuborish yoki zaxiradan tiklash mumkin bo‘lgan oddiy platformalararo fayldir. Fayl formati API darajasida barqarordir: 2004-yilda yaratilgan SQLite 3 fayllari kutubxonaning joriy versiyasi bilan ochiladi, bu ma’lumotlarning uzoq muddatli mosligini kafolatlaydi.
SQLite arxitekturasi sakkizta virtual mashinadan iborat: Tokenizer, Parser, Code Generator, VM, B-Tree, Pager, OS Interface va Utilities. SQL so‘rovi Tokenizer (tokenlarga ajratish), Parser (AST qurish), Code Generator (bayt-kodga aylantirish) bosqichlaridan o‘tadi va B-Tree va Pager orqali ma’lumot sahifalarini o‘qiydigan virtual mashinada bajariladi.
SQLite jadvallar va indekslarni saqlash uchun B-Tree dan foydalanadi. Har bir jadval alohida B-Tree sifatida saqlanadi, unda barg tugunlari ma’lumot qatorlarini o‘z ichiga oladi. Indekslar ham B-Tree sifatida saqlanadi, ammo barglarda kalitlar bilan. Pager fayldan sahifalarni (standart 4096 bayt) xotiraga yuklashni boshqaradi, jurnal yoki WAL orqali ACID tranzaksiyalarini ta’minlaydi.
WAL (Write-Ahead Logging) — mobil ilovalar uchun tavsiya etilgan rejim. O‘zgarishlar avval alohida WAL fayliga yoziladi, so‘ngra davriy ravishda asosiy ma’lumotlar bazasiga ko‘chiriladi. WAL bir vaqtning o‘zida ma’lumotlar bazasidan o‘qish (eski ma’lumotlar) va unga yozish (WAL orqali) imkonini beradi, bu ko‘p oqimli ilovalarning unumdorligini oshiradi. Standart jurnal (rollback journal) yozish paytida o‘qishni bloklaydi.
| Parametr | Rollback Journal | WAL (Write-Ahead Logging) |
|---|---|---|
| Yozish paytida o‘qish | Bloklanadi | Ruxsat etilgan (eski ma’lumotlarni o‘qiydi) |
| Yozish unumdorligi | O‘rtacha | Yuqori (ketma-ket WAL yozuvi) |
| Disk iste’moli | Kam (faqat orqaga qaytarish jurnali) | Ko‘p (WAL + asosiy MBT) |
| Nosozlikdan tiklash | Oxirgi nazorat nuqtasiga qaytarish | WAL-dan tiklash (ma’lumotlar yo‘qolmaydi) |
| Tavsiya | Yagona oqimli stsenariylar uchun | Oddiy mobil ilovalar uchun |
Rejimlar o‘rtasida o‘tish bitta SQL so‘rovi bilan amalga oshiriladi: PRAGMA journal_mode=WAL. Fon sinxronizatsiyasi va bir vaqtning o‘zida ma’lumotlarni o‘qiyotgan UI oqimi bo‘lgan mobil ilovalar uchun WAL yaxshiroq unumdorlik va interfeys bloklanmasligini ta’minlaydi.
SQLite mahalliy ma’lumotlarni saqlash uchun yagona variant emas, ammo eng universalidir. Realm xotiradagi ob’ektlarga to‘g‘ridan-to‘g‘ri kirish uchun yuqori tezlikni taklif qiladi, ammo o‘zining NoSQL formatidan foydalanadi va kattaroq kutubxona hajmiga ega. iOS-da Core Data SQLite ustidagi ORM qatlami bo‘lib, ob’ekt grafigini boshqarish va operatsiyalarni bekor qilishni qo‘shadi.
Aksariyat ilovalar uchun SQLite bashorat qilinadigan unumdorlik, sotuvchiga bog‘liq bo‘lmaslik va vaqt sinovidan o‘tgan barqarorlik tufayli eng maqbul tanlov bo‘lib qoladi. Realm va Core Data murakkab ob’ekt grafiklari, reaktiv so‘rovlar yoki qurilmalar o‘rtasida sinxronizatsiya talab qilinadigan loyihalarda o‘zini oqlaydi.
| Xususiyat | SQLite | Realm | Core Data |
|---|---|---|---|
| MBT turi | Relyatsion (SQL) | NoSQL (ob’ektli) | ORM (SQLite ustida) |
| Kutubxona hajmi | ~600 KB | ~4 MB | Apple SDK-ga o‘rnatilgan |
| Unumdorlik | O‘rtacha | Yuqori (xotiradagi ob’ektlar) | O‘rtacha (ORM yuki) |
| Platformalar | iOS, Android, Web, Desktop | iOS, Android, Node.js | iOS, macOS |
| Sotuvchiga bog‘liqlik | Yo‘q (ochiq standart) | O‘rtacha (o‘z formati) | Yuqori (faqat Apple) |
SQLite, Realm va Core Data o‘rtasidagi tanlov platformaga, ob’ekt modeli talablariga va sinxronizatsiya strategiyasiga bog‘liq. Platformalararo loyihalar (KMP, Flutter) uchun SQLite ma’lumotlar modelini o‘zgartirmasdan barcha maqsadli platformalarda ishlaydigan yagona universal tanlov bo‘lib qoladi.
Room — SQLite ustida ORM qatlamini ta’minlaydigan Android Jetpack kutubxonasi. Room annotatsiyalangan DAO interfeyslaridan avtomatik ravishda SQL so‘rovlarini yaratadi, so‘rovlarning to‘g‘riligini kompilyatsiya bosqichida tekshiradi va sxema o‘zgarganda ma’lumotlar bazasi migratsiyalarini qo‘llab-quvvatlaydi. Room Android-da SQLite bilan ishlashning tavsiya etilgan usulidir.
SQLiteOpenHelper — ORMsiz SQLite-ni to‘g‘ridan-to‘g‘ri boshqarish uchun past darajadagi API. Sinif ma’lumotlar bazasini yaratish, ochish va yangilashni boshqaradi. SQLiteOpenHelper oddiy SQL so‘rovlari bo‘lgan yoki Room abstraksiyasisiz SQL mantiqi ustida to‘liq nazorat talab qilinadigan loyihalar uchun mos keladi.
Ob’ekt Room-da @Entity bilan, DAO esa @Dao bilan annotatsiyalanadi. Room annotatsiyalangan metodlarni SQL so‘rovlariga tarjima qiladi: @Insert INSERT yaratadi, @Query — ko‘rsatilgan SQL bilan SELECT. Migratsiyalar eski va yangi sxema versiyasini ko‘rsatgan holda Migration orqali qo‘shiladi. Room SQLni kompilyatsiya bosqichida tekshiradi, bu ishlab chiqarishda sintaksis xatolarini bartaraf qiladi.
@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 ichki RoomDatabase orqali SQLite-ga ish vaqti so‘rovlarini o‘z ichiga olgan UserDao_Impl implementatsiyasini avtomatik yaratadi. Korutinlar (suspend) tufayli DAO metodlari UI-ni bloklamasdan fon oqimida asinxron tarzda bajariladi. @Query-dagi Flow qaytarish turlari jadval o‘zgarganda natijani avtomatik yangilaydi.
FMDB — SQLite C API ustidagi Objective-C qoplamasi, tarixiy jihatdan iOS uchun birinchi ommabop kutubxona. So‘rovlarni bajarish va natijalarni olish uchun FMDatabase va FMResultSet ob’ektlarini taqdim etadi. FMDB sodda va minimalistik, ammo Swift-ga xos konstruksiyalarni — optionallar, Codable, async/await — qo‘llab-quvvatlamaydi.
GRDB — SQLite bilan ishlash uchun zamonaviy Swift kutubxonasi. Type-safe API, Codable qo‘llab-quvvatlashi, Combine Publishers, async/await, migratsiyalar va real vaqt rejimida o‘zgarishlarni kuzatishni ta’minlaydi. GRDB Swift Concurrency bilan to‘liq integratsiya va yaxshiroq kod o‘qilishi tufayli yangi Swift loyihalari uchun afzal ko‘riladi.
GRDB jadvallarni FetchableRecord va TableRecord protokollariga mos keladigan Record sinflari orqali belgilaydi. So‘rovlar xom SQL bilan emas, balki Swift-da type-safe sintaksis bilan yoziladi. GRDB shuningdek sxemani versiyalash va ilova versiyalari o‘rtasida migratsiyalar uchun DatabaseMigrator-ni qo‘llab-quvvatlaydi.
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 parallel o‘qish uchun SQLite WAL rejimidan foydalanadi. Bir nechta o‘quvchilar bir vaqtning o‘zida ma’lumotlar bazasiga murojaat qilishi mumkin, bir yozuvchi esa WAL orqali ma’lumotlarni yangilaydi. GRDB ulanishlar va tranzaksiyalarni avtomatik boshqaradi, qo‘lda sinxronizatsiyasiz istalgan oqimdan bazaga xavfsiz kirishni ta’minlaydi.
Indekslar — SQLite so‘rovlarini tezlashtirishning eng samarali usuli. Indeks WHERE, JOIN va ORDER BY da qatnashadigan ustunlarda yaratiladi. 100 000 yozuvli jadval uchun indekslangan ustun bo‘yicha qidiruv soniyalar o‘rniga millisekundlarda amalga oshiriladi. Biroq indekslar INSERT va UPDATE-ni sekinlashtiradi, shuning uchun ularning soni yozish chastotasi bilan muvozanatlashtirilishi kerak.
Guruhli qo‘shish (batch insert) bitta tranzaksiya doirasida ommaviy ma’lumot yuklashni tubdan tezlashtiradi. 1000 ta yozuvni birma-bir qo‘shish taxminan 1 soniya qo‘shimcha yuk beradi. Xuddi shu 1000 ta yozuvni bitta tranzaksiyada qo‘shish — taxminan 5–10 millisekund. Farq har bir alohida INSERT diskka sinxron yozish bilan yangi tranzaksiya yaratishi bilan izohlanadi.
PRAGMA — kutubxona xatti-harakatini sozlash uchun SQLite buyruqlari. Asosiy optimallashtirish PRAGMA-lari: PRAGMA synchronous=NORMAL (fsync chastotasini kamaytiradi), PRAGMA cache_size=-8000 (8 MB kesh ajratadi), PRAGMA temp_store=MEMORY (vaqtinchalik jadvallar xotirada). Katta hajmdagi ma’lumotlarga ega mobil ilovalar uchun ushbu PRAGMA-larning kombinatsiyasi so‘rovlarni 2–3 marta tezlashtiradi.
Yana bir muhim optimallashtirish — SQL so‘rovlarining oldindan kompilyatsiyasi (prepared statements). Agar so‘rov bir necha marta bajarilsa (masalan, 10 000 qatorni qo‘shish), SQL-ni bir marta kompilyatsiya qilish va keyin statement-dan foydalish CPU yukini 30–50% ga kamaytiradi. Room va GRDB prepared statements-larni avtomatik keshlaydi, ammo SQLite C API-dan to‘g‘ridan-to‘g‘ri foydalanganda kompilyatsiyani qo‘lda bajarish kerak.
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 bilan guruhli qo‘shish barcha INSERT-larning bitta tranzaksiya doirasida bajarilishini kafolatlaydi. Kichik guruhlarga bo‘lish (chunked) boshqa oqimlarni uzoq vaqt bloklashi mumkin bo‘lgan juda katta tranzaksiyaning oldini oladi. Fon sinxronizatsiyasi uchun 500 ta yozuvli kichik guruh hajmi tezlik va UI sezgirligining optimal muvozanatini ta’minlaydi.
Ko‘p beriladigan savollar
Ha, SQLite WAL rejimida ko‘p oqimli kirishni qo‘llab-quvvatlaydi. Bir nechta oqimlar bir vaqtning o‘zida ma’lumotlarni o‘qishi mumkin, ammo faqat bittasi yoza oladi. Room va GRDB sinxronizatsiyani avtomatik boshqaradi. Rollback journal rejimida (standart) ma’lumotlar bazasi har qanday yozishda to‘liq bloklanadi.
SQLite cheklovi — 281 TB (nazariy maksimum). Amalda ma’lumotlar bazasining hajmi qurilmaning mavjud xotirasi bilan cheklangan. Mobil ilovalar uchun qulay hajm 1–2 GB gacha. 2 GB dan katta ma’lumotlar bazalari zaxira nusxasini, App Store orqali yangilashni sekinlashtiradi va RAM iste’molini oshiradi.
SQLite ma’lumotlarni standart sifatida shifrlamaydi — faylga kirish huquqiga ega har qanday jarayon ularni o‘qishi mumkin. Shifrlash uchun SQLCipher (AES-256 bilan kengaytma), EncryptedDatabase bilan Room (Android) yoki iOS-da Encrypted Core Data dan foydalaning. Shifrlash ma’lumotlarni o‘qish va yozishga 5–15% qo‘shimcha yuk qo‘shadi.
SQLite — server jarayonini talab qilmaydigan o‘rnatilgan (embedded) kutubxona. MySQL — alohida server, foydalanuvchilar, kirish huquqlari va tarmoq protokoli bilan mijoz-server MBT. SQLite ma’lumotlar bazasini bitta faylda saqlaydi, MySQL — server tomonidan boshqariladigan bir nechta fayllarda. SQLite sodda va yengil, MySQL kuchliroq va masshtablanuvchan.
Migratsiya uchun ALTER TABLE (ustun qo‘shish) yoki ma’lumotlarni ko‘chirish va eskisini o‘chirish bilan yangi jadval yaratishdan foydalaning. Room bu jarayonni Migration sinflari orqali avtomatlashtiradi: startVersion, endVersion va sxemani o‘zgartirish uchun SQL so‘rovlarini belgilang. GRDB va FMDB shunga o‘xshash DatabaseMigrator-ni taqdim etadi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.
Shuningdek o'qing