SQLite (Kotlin Multiplatform)

Die androidx.sqlite-Bibliothek enthält abstrakte Schnittstellen mit grundlegenden Implementierungen, mit denen Sie Ihre eigenen Bibliotheken erstellen können, die auf SQLite zugreifen. Sie können die Bibliothek Room verwenden. Sie bietet eine Abstraktionsebene über SQLite, um einen robusteren Datenbankzugriff zu ermöglichen und gleichzeitig die volle Leistung von SQLite zu nutzen.

Abhängigkeiten einrichten

Die aktuelle Version von androidx.sqlite, die Kotlin Multi-Platform (KMP) unterstützt, ist Version 2.5.0-alpha01 oder höher.

Fügen Sie der Datei build.gradle.kts für Ihr Modul die Abhängigkeiten für die Artefakte hinzu, um SQLite in Ihrem KMP-Projekt einzurichten:

  • androidx.sqlite:sqlite – die SQLite-Treiberschnittstellen
  • androidx.sqlite:sqlite-bundled – die gebündelte Treiberimplementierung

SQLite-Treiber-APIs

Die androidx.sqlite-Bibliotheksgruppen bieten Low-Level-APIs für die Kommunikation mit der SQLite-Bibliothek an, die entweder in der Bibliothek bei Verwendung von androidx.sqlite:sqlite-bundled oder auf der Hostplattform wie Android oder iOS bei Verwendung von androidx.sqlite:sqlite-framework enthalten ist. Die APIs stützen sich eng auf die Kernfunktionen der SQLite C API.

Es gibt drei Hauptoberflächen:

  • SQLiteDriver: Der Einstiegspunkt für die Verwendung von SQLite und das Öffnen von Datenbankverbindungen.
  • SQLiteConnection – die Darstellung des sqlite3-Objekts.
  • SQLiteStatement – die Darstellung des sqlite3_stmt-Objekts.

Im folgenden Beispiel werden die wichtigsten APIs veranschaulicht:

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()
}

Ähnlich wie bei SQLite C APIs werden folgende Anwendungen häufig verwendet:

  • Öffnen Sie mit der instanziierten SQLiteDriver-Implementierung eine Datenbankverbindung.
  • SQL-Anweisung mit SQLiteConnection.prepare() vorbereiten
  • So führen Sie ein SQLiteStatement aus:
    • Optional: Binden Sie Argumente mithilfe der bind*()-Funktionen.
    • Durch Iteration über den Ergebnissatz mit der Funktion step().
    • Lesen von Spalten aus der Ergebnismenge mithilfe der get*()-Funktionen

Treiberimplementierungen

In der folgenden Tabelle sind die verfügbaren Treiberimplementierungen zusammengefasst:

Klassenname

Artefakt

Unterstützte Plattformen

AndroidSQLiteDriver androidx.sqlite:sqlite-framework

Android

NativeSQLiteDriver androidx.sqlite:sqlite-framework

iOS, Mac und Linux

BundledSQLiteDriver androidx.sqlite:sqlite-bundled

Android, iOS, Mac, Linux und JVM (Desktop)

Die empfohlene Implementierung ist BundledSQLiteDriver, der in androidx.sqlite:sqlite-bundled verfügbar ist. Sie enthält die aus der Quelle kompilierte SQLite-Bibliothek und bietet die aktuellste Version und Konsistenz auf allen unterstützten KMP-Plattformen.

SQLite-Treiber und -Raum

Die Treiber-APIs sind nützlich für Low-Level-Interaktionen mit einer SQLite-Datenbank. Raum wird für eine funktionsreiche Bibliothek, die einen umfassenderen Zugriff auf SQLite bietet, empfohlen.

Ein RoomDatabase benötigt einen SQLiteDriver, um Datenbankvorgänge auszuführen, und eine Implementierung muss mit RoomDatabase.Builder.setDriver() konfiguriert werden. Room bietet RoomDatabase.useReaderConnection und RoomDatabase.useWriterConnection für einen direkteren Zugriff auf die verwalteten Datenbankverbindungen.