SQLite(Kotlin 多平台)

androidx.sqlite 库包含抽象接口以及基本实现,可用于构建访问 SQLite 的自己的库。您可能需要考虑使用 Room 库,它提供了一个 SQLite 之上的抽象层,以便在利用 SQLite 的全部功能的同时实现更强大的数据库访问。

设置依赖项

支持 Kotlin 多平台 (KMP) 的 androidx.sqlite 的当前版本为 2.5.0-alpha01 或更高版本。

要在您的 KMP 项目中设置 SQLite,请为模块的 build.gradle.kts 文件中添加构件的依赖项

  • androidx.sqlite:sqlite - SQLite 驱动程序接口
  • androidx.sqlite:sqlite-bundled - 捆绑的驱动程序实现

SQLite 驱动程序 API

androidx.sqlite 库组提供低级 API,用于与 SQLite 库通信(使用 androidx.sqlite:sqlite-bundled 时包含在库中)或主机平台(例如使用 androidx.sqlite:sqlite-framework 时使用的 Android 或 iOS)。这些 API 紧密遵循 SQLite C API 的核心功能。

有三个主要接口

以下示例展示了核心 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()
}

与 SQLite C API 类似,常见用法是

  • 使用已实例化的 SQLiteDriver 实现打开数据库连接。
  • 使用 SQLiteConnection.prepare() 准备 SQL 语句。
  • 通过执行 SQLiteStatement
    • 使用 bind*() 函数可选地绑定参数。
    • 使用 step() 函数迭代结果集。
    • 使用 get*() 函数读取结果集中的列。

驱动程序实现

下表总结了可用的驱动程序实现

类名

构件

支持的平台

AndroidSQLiteDriver androidx.sqlite:sqlite-framework

Android

NativeSQLiteDriver androidx.sqlite:sqlite-framework

iOS、Mac 和 Linux

BundledSQLiteDriver androidx.sqlite:sqlite-bundled

Android、iOS、Mac、Linux 和 JVM(桌面)

建议使用的实现是 androidx.sqlite:sqlite-bundled 中提供的 BundledSQLiteDriver。它包含从源代码编译的 SQLite 库,可在所有支持的 KMP 平台上提供最新版本和一致性。

SQLite 驱动程序和 Room

驱动程序 API 可用于与 SQLite 数据库进行低级交互。对于提供更强大的 SQLite 访问功能的丰富功能库,建议使用 Room。

RoomDatabase 依赖于 SQLiteDriver 来执行数据库操作,并且需要使用 RoomDatabase.Builder.setDriver() 配置实现。Room 提供 RoomDatabase.useReaderConnectionRoomDatabase.useWriterConnection 用于更直接地访问托管的数据库连接。