androidx.sqlite kitaplığı, SQLite'e erişen kendi kitaplıklarınızı oluşturmak için kullanılabilecek temel uygulamalarla birlikte soyut arayüzler içerir. SQLite'ın tüm gücünden yararlanırken daha sağlam veritabanı erişimi sağlamak için SQLite üzerinde bir soyutlama katmanı sunan Room kitaplığını kullanmayı düşünebilirsiniz.
Bağımlılıkları ayarlama
KMP projenizde SQLite'ı ayarlamak için modülünüzün build.gradle.kts dosyasındaki yapılarla ilgili bağımlılıkları ekleyin:
[versions]
sqlite = "2.7.0"
[libraries]
# The SQLite Driver interfaces
androidx-sqlite = { module = "androidx.sqlite:sqlite", version.ref = "sqlite" }
# The bundled SQLite driver implementation
androidx-sqlite-bundled = { module = "androidx.sqlite:sqlite-bundled", version.ref = "sqlite" }
[plugins]
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
SQLite sürücüsü API'leri
androidx.sqlite kitaplık grupları, androidx.sqlite:sqlite-bundled kullanılırken kitaplığa dahil edilen veya androidx.sqlite:sqlite-framework kullanılırken Android ya da iOS gibi ana makine platformunda bulunan SQLite kitaplığıyla iletişim kurmak için düşük düzeyli API'ler sunar. API'ler, SQLite C API'sinin temel işlevlerini yakından takip eder.
Üç ana arayüz vardır:
SQLiteDriver: Veritabanı bağlantılarını açmak için kullanılan SQLite'in giriş noktası.SQLiteConnection:sqlite3nesnesini temsil eder.SQLiteStatement:sqlite3_stmtnesnesini temsil eder.
Aşağıdaki örnekte temel API'ler gösterilmektedir:
fun main() {
val databaseConnection = BundledSQLiteDriver().open("todos.db")
databaseConnection.execSQL(
"CREATE TABLE IF NOT EXISTS Todo (id INTEGER PRIMARY KEY, content TEXT)"
)
databaseConnection.prepare(
"INSERT OR IGNORE INTO Todo (id, content) VALUES (? ,?)"
).use { stmt ->
stmt.bindInt(index = 1, value = 1)
stmt.bindText(index = 2, value = "Try Room in the KMP project.")
stmt.step()
}
databaseConnection.prepare("SELECT content FROM Todo").use { stmt ->
while (stmt.step()) {
println("Action item: ${stmt.getText(0)}")
}
}
databaseConnection.close()
}
SQLite C API'lerine benzer şekilde, yaygın kullanım kalıbı şu adımlardan oluşur:
- Örneklenmiş
SQLiteDriveruygulamasıyla bir veritabanı bağlantısı açın. SQLiteConnection.preparekullanarak bir SQL ifadesi hazırlayın.- Aşağıdaki işlemleri yaparak
SQLiteStatementçalıştırın:- İsteğe bağlı:
bind*işlevlerini kullanarak bağımsız değişkenleri bağlayın. stepişlevini kullanarak sonuç kümesinde yineleme yapın.get*işlevlerini kullanarak sonuç kümesindeki sütunları okuyun.
- İsteğe bağlı:
Sürücü Uygulamaları
Aşağıdaki tabloda, kullanılabilir sürücü uygulamaları özetlenmiştir:
Sınıf adı |
Yapı |
Desteklenen Platformlar |
AndroidSQLiteDriver |
androidx.sqlite:sqlite-framework |
Android |
NativeSQLiteDriver |
androidx.sqlite:sqlite-framework |
iOS, Mac ve Linux |
BundledSQLiteDriver |
androidx.sqlite:sqlite-bundled |
Android, iOS, Mac, Linux ve JVM (masaüstü) |
WebWorkerSQLiteDriver |
androidx.sqlite:sqlite-web |
JavaScript ve WebAssembly (WasmJS) |
Kullanılması önerilen uygulama, BundledSQLiteDriver androidx.sqlite:sqlite-bundled'da mevcuttur. Kaynak koddan derlenen SQLite kitaplığını içerir. Bu kitaplık, desteklenen tüm KMP platformlarında en güncel sürümü ve tutarlılığı sunar.
SQLite sürücüsü ve Room
Sürücü API'leri, SQLite veritabanıyla düşük düzeyli etkileşimler için kullanışlıdır. SQLite'e daha sağlam erişim sağlayan, özellik açısından zengin bir kitaplık için Room'u öneririz.
RoomDatabase, veritabanı işlemlerini gerçekleştirmek için SQLiteDriver hizmetine bağlıdır ve RoomDatabase.Builder.setDriver kullanarak bir uygulama yapılandırmanız gerekir. Room, yönetilen veritabanı bağlantılarına daha doğrudan erişim için RoomDatabase.useReaderConnection ve RoomDatabase.useWriterConnection sağlar.
Kotlin Multiplatform'a geçiş yapma
SupportSQLiteDatabase arayüzü gibi düşük seviyeli Support SQLite API bileşenlerinin kullanımını eşdeğer SQLite
Driver bileşenlerine taşımanız gerekir.
Kotlin Multiplatform
Düşük düzeyli SQLiteConnection kullanarak işlem gerçekleştirme
val connection: SQLiteConnection = ...
connection.execSQL("BEGIN IMMEDIATE TRANSACTION")
try {
// perform database operations in transaction
connection.execSQL("END TRANSACTION")
} catch(t: Throwable) {
connection.execSQL("ROLLBACK TRANSACTION")
}
Sonuç vermeyen bir sorgu yürütme
val connection: SQLiteConnection = ...
connection.execSQL("ALTER TABLE ...")
Sonuç içeren ancak bağımsız değişken içermeyen bir sorgu yürütme
val connection: SQLiteConnection = ...
connection.prepare("SELECT * FROM Pet").use { statement ->
while (statement.step()) {
// read columns
statement.getInt(0)
statement.getText(1)
}
}
Sonuç ve bağımsız değişkenlerle sorgu yürütme
connection.prepare("SELECT * FROM Pet WHERE id = ?").use { statement ->
statement.bindInt(1, id)
if (statement.step()) {
// row found, read columns
} else {
// row not found
}
}
Yalnızca Android
SupportSQLiteDatabase kullanarak işlem yapma
val database: SupportSQLiteDatabase = ...
database.beginTransaction()
try {
// perform database operations in transaction
database.setTransactionSuccessful()
} finally {
database.endTransaction()
}
Sonuç vermeyen bir sorgu yürütme
val database: SupportSQLiteDatabase = ...
database.execSQL("ALTER TABLE ...")
Sonuç içeren ancak bağımsız değişken içermeyen bir sorgu yürütme
val database: SupportSQLiteDatabase = ...
database.query("SELECT * FROM Pet").use { cursor ->
while (cursor.moveToNext()) {
// read columns
cursor.getInt(0)
cursor.getString(1)
}
}
Sonuç ve bağımsız değişkenlerle sorgu yürütme
database.query("SELECT * FROM Pet WHERE id = ?", id).use { cursor ->
if (cursor.moveToNext()) {
// row found, read columns
} else {
// row not found
}
}