Mobil ishlanmada SQLite: bu nima va qanday ishlaydi

Muallif: IT Sectr Nashr etilgan: 2026-03-11 O'qish vaqti: 10 daq

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 — nol konfiguratsiyali va ma’lumotlarni bitta faylda saqlaydigan o‘rnatilgan relyatsion MBT.
  • ACID tranzaksiyalari — quvvat uzilishi yoki ilova ishdan chiqishida ham ma’lumotlar yaxlitligini kafolatlaydi.
  • Ma’lumotlar tiplanishi — dinamik: SQLite jadval yaratishda ustun turini qat’iy ko‘rsatishni talab qilmaydi.
  • Room — DAO va annotatsiyalar orqali SQLite bilan ishlashni soddalashtiradigan Android ORM kutubxonasi.
  • CoreData iOS-da SQLite-ni Persistent Store sifatida ishlatishi mumkin, ammo ob’ektlarni boshqarish qatlamini qo‘shadi.

SQLite nima?

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.

SQLite-ning asosiy xususiyatlari

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 qanday tuzilgan: arxitektura va saqlash

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.

Jurnallashtirish rejimlari

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.

ParametrRollback JournalWAL (Write-Ahead Logging)
Yozish paytida o‘qishBloklanadiRuxsat etilgan (eski ma’lumotlarni o‘qiydi)
Yozish unumdorligiO‘rtachaYuqori (ketma-ket WAL yozuvi)
Disk iste’moliKam (faqat orqaga qaytarish jurnali)Ko‘p (WAL + asosiy MBT)
Nosozlikdan tiklashOxirgi nazorat nuqtasiga qaytarishWAL-dan tiklash (ma’lumotlar yo‘qolmaydi)
TavsiyaYagona oqimli stsenariylar uchunOddiy 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 va mobil ishlanmadagi boshqa MBTlar

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.

XususiyatSQLiteRealmCore Data
MBT turiRelyatsion (SQL)NoSQL (ob’ektli)ORM (SQLite ustida)
Kutubxona hajmi~600 KB~4 MBApple SDK-ga o‘rnatilgan
UnumdorlikO‘rtachaYuqori (xotiradagi ob’ektlar)O‘rtacha (ORM yuki)
PlatformalariOS, Android, Web, DesktopiOS, Android, Node.jsiOS, macOS
Sotuvchiga bog‘liqlikYo‘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.

Android-da SQLite: Room va SQLiteOpenHelper

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.

Room uchun ob’ekt va DAO namunasi

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.

kotlin
@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.

iOS-da SQLite: FMDB va GRDB

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.

Swift-da GRDB namunasi

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.

swift
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.

SQLite unumdorligini optimallashtirish

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.

Unumdorlik PRAGMA-lari

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.

kotlin
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

SQLite-dan bir nechta oqimlarda foydalanish mumkinmi?

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.

Mobil qurilmada SQLite ma’lumotlar bazasining maksimal hajmi qancha?

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-dagi ma’lumotlar xavfsizmi?

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 MySQL-dan qanday farq qiladi?

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.

Ma’lumotlarni yo‘qotmasdan SQLite sxemasini qanday yangilash mumkin?

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

  • SQLite — iOS va Android-dagi har bir mobil ilovada mahalliy ma’lumotlarni saqlash uchun ishlatiladigan nol konfiguratsiyali o‘rnatilgan relyatsion MBT.
  • ACID tranzaksiyalari va WAL rejimi ma’lumotlar yaxlitligini va ilovaning bir nechta oqimlaridan parallel kirishni ta’minlaydi.
  • Room (Android) va GRDB (iOS) — type-safe API va avtomatik migratsiyalar orqali baza bilan ishlashni soddalashtiradigan zamonaviy SQLite qoplamalari.
  • SQLite-ning B-Tree arxitekturasi indekslar bo‘yicha samarali qidirishni, guruhli tranzaksiyalar va prepared statements esa yuqori yozish unumdorligini ta’minlaydi.
  • SQLite universallik (barcha platformalar), kutubxona hajmi va sotuvchiga bog‘liq bo‘lmaslik jihatidan Realm va Core Data-dan ustundir.
  • Indekslar, WAL rejimi va PRAGMA sozlamalari orqali optimallashtirish odatdagi mobil yuklamalarda so‘rovlarni 2–3 marta tezlashtiradi.
  • Tavsiya — Android-da Room va iOS-da GRDB orqali SQLite-ni mobil ilova mahalliy ma’lumotlari uchun asosiy saqlash vositasi sifatida ishlating.

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.

Loyihani muhokama qilish

Shuningdek o'qing