Mobil geliştirmede SQLite: Nedir ve nasıl çalışır

Yazar: IT Sectr Yayınlanma: 2026-03-11 Okuma süresi: 10 dk

SQLite, ayrı bir sunucu süreci olmadan çalışan ve tüm veritabanını cihazdaki tek bir dosyada depolayan gömülü bir ilişkisel veritabanıdır. Sıfır yapılandırma, küçük kütüphane boyutu ve tam SQL desteği sayesinde SQLite, mobil uygulamalarda yerel veri depolama standardı haline gelmiştir. SQLite Konsorsiyumu'na (2025) göre, bu DBMS, iOS ve Android'deki her akıllı telefon dahil olmak üzere 4 milyardan fazla cihazda kullanılmaktadır.

Önemli Noktalar

  • SQLite, sıfır yapılandırma ve tek dosyada veri depolama ile gömülü bir ilişkisel DBMS'dir.
  • ACID işlemleri, güç kesintileri veya uygulama çökmelerinde bile veri bütünlüğünü garanti eder.
  • Veri tiplemesi dinamiktir: SQLite, tablo oluştururken sütun türünün kesin olarak belirtilmesini gerektirmez.
  • Room, DAO'lar ve notlar aracılığıyla SQLite ile çalışmayı basitleştiren bir Android ORM kütüphanesidir.
  • CoreData, iOS'ta Persistent Store olarak SQLite'ı kullanabilir ancak bir nesne yönetim katmanı ekler.

SQLite nedir?

SQLite, özel bir sunucu olmadan ilişkisel bir DBMS uygulayan C dilinde bir kütüphanedir. Doğrudan uygulamaya gömülür, cihazın dosya sistemindeki sıradan bir dosyaya veri okur ve yazar. Kütüphane boyutu yaklaşık 600 KB'dir ve bu, SQLite'ı en hafif tam özellikli SQL veritabanı yapar.

SQLite, JOIN, alt sorgular, tetikleyiciler, görünümler, indeksler ve pencere işlevleri dahil olmak üzere SQL:1999 standardının çoğunu destekler. Sınırlamalar ALTER TABLE (sınırlı destek) ve tam RIGHT/FULL OUTER JOIN ile ilgilidir. Yine de, mobil uygulamalar için SQLite'ın işlevselliği yerel depolama durumlarının %99'unda yeterlidir.

Stack Overflow geliştirici anketine (2025) göre, SQLite gömülü çözümler için en popüler veritabanıdır ve MySQL ve PostgreSQL'den sonra tüm DBMS'ler arasında popülerlikte üçüncü sıradadır. Mobil geliştirmede SQLite, her uygulamada doğrudan veya sarmalayıcılar aracılığıyla kullanılır.

SQLite'ın temel özellikleri

Sıfır yapılandırma — SQLite kurulum, izin ayarları, kullanıcı oluşturma veya hizmet başlatma gerektirmez. Kütüphane projeye bağlanır ve veritabanı tek bir işlev çağrılarak oluşturulur. Bu, sunucu kurulumu, port yapılandırması ve kullanıcı ayarları gerektiren istemci-sunucu DBMS'lerine kıyasla dağıtımı kökten basitleştirir.

SQLite veritabanı dosyası, kopyalanabilen, analiz edilebilen, ağ üzerinden gönderilebilen veya yedekten geri yüklenebilen sıradan bir platformlar arası dosyadır. Dosya biçimi API düzeyinde kararlıdır: 2004'te oluşturulan SQLite 3 dosyaları, kütüphanenin mevcut sürümüyle açılır ve uzun vadeli veri uyumluluğu sağlar.

SQLite nasıl çalışır: mimari ve depolama

SQLite'ın mimarisi sekiz sanal makineden oluşur: Tokenizer, Parser, Code Generator, VM, B-Tree, Pager, OS Interface ve Utilities. Bir SQL sorgusu Tokenizer (tokenlara ayırma), Parser (AST oluşturma), Code Generator (bytecode'a dönüştürme) aşamalarından geçer ve B-Tree ile Pager aracılığıyla veri sayfalarını okuyan sanal makinede yürütülür.

SQLite, tabloları ve indeksleri depolamak için B-Tree kullanır. Her tablo, yaprak düğümleri veri satırlarını içeren ayrı bir B-Tree olarak depolanır. İndeksler de B-Tree olarak depolanır ancak yapraklarda anahtarlar bulunur. Pager, dosyadan belleğe sayfa yüklemesini (varsayılan 4096 bayt) yönetir ve bir günlük veya WAL aracılığıyla ACID işlemleri sağlar.

Günlük modları

WAL (Write-Ahead Logging) mobil uygulamalar için önerilen moddur. Değişiklikler önce ayrı bir WAL dosyasına yazılır ve ardından periyodik olarak ana veritabanına taşınır. WAL, veritabanında aynı anda okumaya (eski veriler) ve yazmaya (WAL aracılığıyla) izin vererek çok iş parçacıklı uygulamaların performansını artırır. Standart günlük (rollback journal) yazma sırasında okumayı engeller.

ParametreRollback JournalWAL (Write-Ahead Logging)
Yazma sırasında okumaEngellenirİzin verilir (eski verileri okur)
Yazma performansıOrtaYüksek (WAL'a sıralı yazma)
Disk tüketimiDaha az (yalnızca rollback günlüğü)Daha fazla (WAL + ana veritabanı)
Çökme kurtarmaSon kontrol noktasına geri almaWAL'dan kurtarma (veri kaybı yok)
ÖneriTek iş parçacıklı senaryolar içinTipik mobil uygulamalar için

Modlar arasında geçiş tek bir SQL sorgusuyla yapılır: PRAGMA journal_mode=WAL. Arka plan senkronizasyonu ve aynı anda veri okuyan bir UI iş parçacığına sahip mobil uygulamalar için WAL, daha iyi performans ve arayüz kilitlenmesi olmaması sağlar.

Mobil geliştirmede SQLite vs diğer veritabanları

SQLite yerel veri depolama için tek seçenek değildir, ancak en çok yönlü olanıdır. Realm, bellekteki nesnelere doğrudan erişimde daha yüksek hız sunar ancak kendi NoSQL biçimini kullanır ve daha büyük bir kütüphane boyutuna sahiptir. iOS'ta Core Data, SQLite üzerinde nesne grafiği yönetimi ve işlem geri alma ekleyen bir ORM katmanıdır.

Çoğu uygulama için SQLite, öngörülebilir performansı, satıcı bağımlılığının olmaması ve zamanla test edilmiş kararlılığı sayesinde en uygun seçim olmaya devam etmektedir. Realm ve Core Data, karmaşık nesne grafikleri, reaktif sorgular veya cihazlar arası senkronizasyon gereksinimleri olan projelerde haklı çıkar.

ÖzellikSQLiteRealmCore Data
Veritabanı türüİlişkisel (SQL)NoSQL (nesne tabanlı)ORM (SQLite üzerinde)
Kütüphane boyutu~600 KB~4 MBApple SDK'sında yerleşik
PerformansOrtaYüksek (bellekteki nesneler)Orta (ORM yükü)
PlatformlariOS, Android, Web, MasaüstüiOS, Android, Node.jsiOS, macOS
Satıcı bağımlılığıYok (açık standart)Orta (özel biçim)Yüksek (yalnızca Apple)

SQLite, Realm ve Core Data arasındaki seçim platforma, nesne modeli gereksinimlerine ve senkronizasyon stratejisine bağlıdır. Platformlar arası projeler (KMP, Flutter) için SQLite, veri modelinde değişiklik yapmadan tüm hedef platformlarda çalışan tek evrensel seçimdir.

Android'de SQLite: Room ve SQLiteOpenHelper

Room, Android Jetpack'ten SQLite üzerinde bir ORM katmanı sağlayan bir kütüphanedir. Room, not eklenmiş DAO arayüzlerinden otomatik olarak SQL sorguları oluşturur, sorgu doğruluğunu derleme zamanında doğrular ve şema değiştiğinde veritabanı geçişlerini destekler. Room, Android'de SQLite ile çalışmanın önerilen yoludur.

SQLiteOpenHelper, ORM olmadan doğrudan SQLite yönetimi için düşük seviyeli bir API'dir. Sınıf, veritabanı oluşturma, açma ve güncellemeyi yönetir. SQLiteOpenHelper, basit SQL sorguları olan projeler veya Room soyutlaması olmadan SQL mantığı üzerinde tam kontrole ihtiyaç duyulduğunda uygundur.

Room için Varlık ve DAO örneği

Room'da bir varlık @Entity ile, DAO ise @Dao ile notlanır. Room, not eklenmiş yöntemleri SQL sorgularına çevirir: @Insert INSERT oluşturur, @Query belirtilen SQL ile SELECT oluşturur. Geçişler, eski ve yeni şema sürümleri belirtilerek Migration sınıfları aracılığıyla eklenir. Room, SQL'i derleme zamanında doğrular ve üretimde sözdizimi hatalarını ortadan kaldırır.

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, dahili RoomDatabase aracılığıyla çalışma zamanı SQLite sorgularını içeren UserDao_Impl uygulamasını otomatik olarak oluşturur. Coroutine'ler (suspend) sayesinde DAO yöntemleri, UI'yı bloke etmeden arka plan iş parçacığında eşzamansız olarak yürütülür. @Query'deki Flow dönüş türleri, tablo değiştiğinde sonucu otomatik olarak günceller.

iOS'ta SQLite: FMDB ve GRDB

FMDB, SQLite C API'si üzerinde bir Objective-C sarmalayıcısıdır, tarihsel olarak iOS için ilk popüler kütüphanedir. Sorguları yürütmek ve sonuçları almak için FMDatabase ve FMResultSet nesneleri sağlar. FMDB basit ve minimalisttir, ancak Swift'e özgü yapıları (optionals, Codable, async/await) desteklemez.

GRDB, SQLite ile çalışmak için modern bir Swift kütüphanesidir. Tür güvenli API, Codable desteği, Combine Publishers, async/await, geçişler ve gerçek zamanlı değişiklik gözlemi sağlar. GRDB, Swift Concurrency ile tam entegrasyonu ve daha iyi kod okunabilirliği sayesinde yeni Swift projeleri için tercih edilir.

Swift'te GRDB örneği

GRDB, FetchableRecord ve TableRecord protokollerine uyan Record sınıfları aracılığıyla tabloları tanımlar. Sorgular, ham SQL yerine tür güvenli sözdizimi ile Swift'te yazılır. GRDB ayrıca şema sürümlemesi ve uygulama sürümleri arasında geçişler için DatabaseMigrator'ı da destekler.

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, eşzamanlı okuma için SQLite'ın WAL modunu kullanır. Birden çok okuyucu aynı anda veritabanına erişebilirken tek bir yazıcı WAL aracılığıyla verileri günceller. GRDB, bağlantıları ve işlemleri otomatik olarak yönetir ve manuel senkronizasyon olmadan herhangi bir iş parçacığından iş parçacığı güvenli veritabanı erişimi sağlar.

SQLite performans optimizasyonu

İndeksler, SQLite sorgularını hızlandırmanın en etkili yoludur. WHERE, JOIN ve ORDER BY yan tümcelerinde kullanılan sütunlarda bir indeks oluşturulur. 100000 kayıtlı bir tablo için, indekslenmiş bir sütunda arama saniyeler yerine milisaniyeler sürer. Ancak, indeksler INSERT ve UPDATE işlemlerini yavaşlatır, bu nedenle sayıları yazma sıklığıyla dengelenmelidir.

Tek bir işlem içinde toplu ekleme (batch insert), toplu veri yüklemeyi kökten hızlandırır. 1000 kaydı tek tek eklemek yaklaşık 1 saniyelik bir yük oluşturur. Aynı 1000 kaydı tek bir işlemde eklemek yaklaşık 5-10 milisaniye sürer. Fark, her bir INSERT'in senkron disk yazma ile yeni bir işlem oluşturmasıyla açıklanır.

Performans PRAGMA'ları

PRAGMA, kütüphane davranışını yapılandırmak için SQLite komutlarıdır. Ana optimizasyon pragmaları: PRAGMA synchronous=NORMAL (fsync sıklığını azaltır), PRAGMA cache_size=-8000 (8 MB önbellek ayırır), PRAGMA temp_store=MEMORY (bellekte geçici tablolar). Büyük veri hacimlerine sahip mobil uygulamalar için bu pragmaların kombinasyonu sorguları 2-3 kat hızlandırır.

Bir diğer önemli optimizasyon, SQL sorgularının ön derlemesidir (prepared statements). Bir sorgu tekrar tekrar yürütülüyorsa (örneğin, 10000 satır ekleme), SQL'i bir kez derlemek ve ifadeyi yeniden kullanmak CPU yükünü %30-50 azaltır. Room ve GRDB, prepared statement'ları otomatik olarak önbelleğe alır, ancak SQLite C API'sini doğrudan kullanırken derleme manuel olarak yapılmalıdır.

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 ile toplu ekleme, tüm INSERT işlemlerinin tek bir işlem içinde yürütülmesini sağlar. Parçalara (chunked) bölme, tek bir işlemin çok büyük olmasını ve diğer iş parçacıklarını uzun süre bloke etmesini önler. Arka plan senkronizasyonu için 500 kayıtlık alt işlem boyutu, hız ve UI yanıt verme hızı arasında optimum denge sağlar.

Sıkça sorulan sorular

SQLite birden çok iş parçacığında kullanılabilir mi?

Evet, SQLite WAL modunda çok iş parçacıklı erişimi destekler. Birden çok iş parçacığı aynı anda veri okuyabilir, ancak yalnızca biri yazabilir. Room ve GRDB senkronizasyonu otomatik olarak yönetir. Rollback journal modunda (varsayılan), herhangi bir yazma işlemi sırasında veritabanı tamamen kilitlenir.

Mobil cihazda SQLite veritabanının maksimum boyutu nedir?

SQLite'ın sınırı 281 TB'dir (teorik maksimum). Pratikte, veritabanı boyutu cihazın kullanılabilir belleğiyle sınırlıdır. Mobil uygulamalar için rahat bir boyut 1-2 GB'a kadardır. 2 GB'dan büyük veritabanları yedeklemeleri, App Store güncellemelerini yavaşlatır ve RAM tüketimini artırır.

SQLite'daki veriler güvenli midir?

SQLite varsayılan olarak verileri şifrelemez — dosyaya erişimi olan herhangi bir işlem onları okuyabilir. Şifreleme için SQLCipher (AES-256 uzantısı), EncryptedDatabase (Android) ile Room veya iOS'ta Encrypted Core Data kullanın. Şifreleme, veri okuma ve yazma işlemlerine %5-15 yük ekler.

SQLite ve MySQL arasındaki fark nedir?

SQLite, sunucu süreci gerektirmeyen gömülü bir kütüphanedir. MySQL, ayrı bir sunucu, kullanıcılar, erişim hakları ve ağ protokolü olan bir istemci-sunucu DBMS'sidir. SQLite veritabanını tek bir dosyada saklar; MySQL, sunucu tarafından yönetilen birden çok dosyada saklar. SQLite daha basit ve hafiftir; MySQL daha güçlü ve ölçeklenebilirdir.

Veri kaybı olmadan SQLite şeması nasıl güncellenir?

SQLite geçişi için ALTER TABLE (sütun ekleme) kullanın veya veri aktarımı ve eski tablonun silinmesiyle yeni bir tablo oluşturun. Room, Migration sınıfları aracılığıyla bu süreci otomatikleştirir: startVersion, endVersion ve şema değişiklikleri için SQL sorguları belirtin. GRDB ve FMDB benzer DatabaseMigrator sağlar.

Özet

  • SQLite, sıfır yapılandırmalı gömülü bir ilişkisel DBMS'dir ve iOS ile Android'deki her mobil uygulamada yerel veri depolama için kullanılır.
  • ACID işlemleri ve WAL modu, veri bütünlüğünü ve birden çok uygulama iş parçacığından eşzamanlı erişimi garanti eder.
  • Room (Android) ve GRDB (iOS), tür güvenli API'ler ve otomatik geçişler aracılığıyla veritabanı çalışmasını basitleştiren SQLite üzerindeki modern sarmalayıcılardır.
  • SQLite'ın B-Tree mimarisi, indeksler aracılığıyla verimli arama sağlarken, toplu işlemler ve prepared statements yüksek yazma performansı sunar.
  • SQLite, çok yönlülük (tüm platformlar), kütüphane boyutu ve satıcı bağımlılığının olmaması açısından Realm ve Core Data'yı geride bırakır.
  • İndeksler, WAL modu ve PRAGMA ayarları aracılığıyla optimizasyon, tipik mobil iş yüklerinde sorguları 2-3 kat hızlandırır.
  • Öneri — Android'de Room ve iOS'ta GRDB aracılığıyla mobil uygulamalar için birincil yerel veri deposu olarak SQLite'ı kullanın.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun