SQLite (мультиплатформенность Kotlin)

Библиотека androidx.sqlite содержит абстрактные интерфейсы и базовые реализации, которые можно использовать для создания собственных библиотек, обращающихся к SQLite. Возможно, вы захотите рассмотреть возможность использования библиотеки Room , которая обеспечивает уровень абстракции поверх SQLite, чтобы обеспечить более надежный доступ к базе данных, используя при этом всю мощь SQLite.

Настройка зависимостей

Текущая версия androidx.sqlite , поддерживающая многоплатформенность Kotlin (KMP), — 2.5.0-alpha01 или выше.

Чтобы настроить SQLite в проекте KMP, добавьте зависимости для артефактов в файл build.gradle.kts для вашего модуля:

  • androidx.sqlite:sqlite — интерфейсы драйвера SQLite.
  • androidx.sqlite:sqlite-bundled — реализация встроенного драйвера.

API-интерфейсы драйверов SQLite

Группы библиотек androidx.sqlite предлагают низкоуровневые API для связи с библиотекой SQLite, включенной либо в библиотеку при использовании androidx.sqlite:sqlite-bundled , либо в хост-платформу, например Android или iOS, при использовании androidx.sqlite:sqlite-framework . API-интерфейсы точно соответствуют основным функциям SQLite C API.

Существует 3 основных интерфейса:

  • SQLiteDriver — это точка входа в использование SQLite, отвечающая за открытие подключений к базе данных.
  • SQLiteConnection — представление объекта sqlite3 .
  • SQLiteStatement — представление объекта sqlite3_stmt .

В следующем примере демонстрируются основные API:

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

Подобно API SQLite C, обычное использование заключается в следующем:

  • Откройте соединение с базой данных, используя созданную реализацию SQLiteDriver .
  • Подготовьте оператор SQL с помощью SQLiteConnection.prepare()
  • Выполните SQLiteStatement следующим образом:
    • Опционально связывание аргументов с помощью функций bind*() .
    • Перебор результирующего набора с помощью функции step() .
    • Чтение столбцов из набора результатов с помощью функций get*() .

Реализации драйверов

В следующей таблице приведены доступные реализации драйверов:

Имя класса

Артефакт

Поддерживаемые платформы

AndroidSQLiteDriver androidx.sqlite:sqlite-framework

Андроид

NativeSQLiteDriver androidx.sqlite:sqlite-framework

iOS, Mac и Linux

BundledSQLiteDriver androidx.sqlite:sqlite-bundled

Android, iOS, Mac, Linux и JVM (настольный компьютер)

Рекомендуемая реализация — BundledSQLiteDriver доступная в androidx.sqlite:sqlite-bundled . Он включает библиотеку SQLite, скомпилированную из исходного кода, предлагающую самую актуальную версию и согласованность на всех поддерживаемых платформах KMP.

Драйвер SQLite и комната

API-интерфейсы драйверов полезны для низкоуровневого взаимодействия с базой данных SQLite. Для многофункциональной библиотеки, обеспечивающей более надежный доступ к SQLite, рекомендуется использовать Room.

RoomDatabase использует SQLiteDriver для выполнения операций с базой данных, и реализацию необходимо настроить с помощью RoomDatabase.Builder.setDriver() . Room предоставляет RoomDatabase.useReaderConnection и RoomDatabase.useWriterConnection для более прямого доступа к управляемым подключениям к базе данных.