SQLite (Kotlin multiplataforma)

La biblioteca androidx.sqlite contiene interfaces abstractas junto con implementaciones básicas que se pueden usar para compilar tus propias bibliotecas que acceden a SQLite. Te recomendamos que consideres usar la biblioteca de Room, que proporciona una capa de abstracción para SQLite que permite acceder a la base de datos sin problemas y, al mismo tiempo, aprovechar toda la potencia de SQLite.

Configura dependencias

La versión actual de androidx.sqlite compatible con Kotlin multiplataforma (KMP) es la 2.5.0-alpha01 o una posterior.

Para configurar SQLite en tu proyecto KMP, agrega las dependencias de los artefactos en el archivo build.gradle.kts de tu módulo:

  • androidx.sqlite:sqlite: Interfaces del controlador de SQLite
  • androidx.sqlite:sqlite-bundled: Es la implementación del controlador empaquetado.

APIs de controlador de SQLite

Los grupos de bibliotecas androidx.sqlite ofrecen APIs de bajo nivel para comunicarse con la biblioteca de SQLite, ya sea incluida en la biblioteca cuando se usa androidx.sqlite:sqlite-bundled o en la plataforma host, como Android o iOS, cuando se usa androidx.sqlite:sqlite-framework. Las APIs siguen de cerca la funcionalidad principal de la API de SQLite para C.

Hay 3 interfaces principales:

  • SQLiteDriver: Es el punto de entrada para usar SQLite y es responsable de abrir las conexiones de la base de datos.
  • SQLiteConnection: Es la representación del objeto sqlite3.
  • SQLiteStatement: Es la representación del objeto sqlite3_stmt.

En el siguiente ejemplo, se muestran las APIs principales:

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

Al igual que las APIs de SQLite C, el uso común es el siguiente:

  • Abre una conexión de base de datos con la implementación de SQLiteDriver con instancia.
  • Prepara una instrucción de SQL con SQLiteConnection.prepare()
  • Ejecuta un SQLiteStatement de la siguiente manera:
    • Opcionalmente, vincular argumentos con las funciones bind*()
    • Iterar sobre el conjunto de resultados mediante la función step()
    • Leer columnas del conjunto de resultados con las funciones get*()

Implementaciones de controladores

En la siguiente tabla, se resumen las implementaciones de controladores disponibles:

Nombre de clase

Artefacto

Plataformas admitidas

AndroidSQLiteDriver androidx.sqlite:sqlite-framework

Android

NativeSQLiteDriver androidx.sqlite:sqlite-framework

iOS, Mac y Linux

BundledSQLiteDriver androidx.sqlite:sqlite-bundled

Android, iOS, Mac, Linux y JVM (computadoras de escritorio)

La implementación recomendada para usar es BundledSQLiteDriver disponible en androidx.sqlite:sqlite-bundled. Incluye la biblioteca de SQLite compilada desde la fuente, que ofrece la versión más actualizada y coherencia en todas las plataformas de KMP compatibles.

Controlador y Room de SQLite

Las APIs del controlador son útiles para interacciones de bajo nivel con una base de datos SQLite. Se recomienda Room para una biblioteca con muchas funciones que proporcione un acceso más sólido a SQLite.

Un RoomDatabase se basa en un SQLiteDriver para realizar operaciones de base de datos y se debe configurar una implementación con RoomDatabase.Builder.setDriver(). Room proporciona RoomDatabase.useReaderConnection y RoomDatabase.useWriterConnection para un acceso más directo a las conexiones de bases de datos administradas.