SQLite (کوتلین چند پلتفرم)

کتابخانه androidx.sqlite شامل رابط های انتزاعی به همراه پیاده سازی های اساسی است که می تواند برای ساخت کتابخانه های خود که به SQLite دسترسی دارند استفاده شود. ممکن است بخواهید از کتابخانه Room استفاده کنید، که یک لایه انتزاعی را بر روی SQLite فراهم می کند تا امکان دسترسی قوی تر به پایگاه داده و در عین حال استفاده از قدرت کامل SQLite را فراهم کند.

وابستگی ها را تنظیم کنید

برای راه اندازی SQLite در پروژه KMP خود، وابستگی های مصنوعات را در فایل build.gradle.kts برای ماژول خود اضافه کنید:

[versions]
sqlite = "2.5.2"

[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" }

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 به روش زیر اجرا کنید:
    1. به صورت اختیاری آرگومان ها را با استفاده از توابع bind*() پیوند دهید.
    2. با استفاده از تابع step() روی مجموعه نتیجه تکرار کنید.
    3. با استفاده از توابع get*() ستون ها را از مجموعه نتیجه بخوانید.

پیاده سازی درایور

جدول زیر پیاده سازی درایورهای موجود را خلاصه می کند:

نام کلاس

مصنوع

پلتفرم های پشتیبانی شده

AndroidSQLiteDriver androidx.sqlite:sqlite-framework

اندروید

NativeSQLiteDriver androidx.sqlite:sqlite-framework

iOS، Mac و Linux

BundledSQLiteDriver androidx.sqlite:sqlite-bundled

Android، iOS، Mac، Linux و JVM (Desktop)

پیاده سازی توصیه شده برای استفاده BundledSQLiteDriver است که در androidx.sqlite:sqlite-bundled موجود است. این شامل کتابخانه SQLite است که از منبع کامپایل شده است و به روزترین نسخه و سازگاری را در تمام پلتفرم های KMP پشتیبانی شده ارائه می دهد.

درایور و اتاق SQLite

APIهای درایور برای تعاملات سطح پایین با پایگاه داده SQLite مفید هستند. برای یک کتابخانه غنی از ویژگی که دسترسی قوی تری به SQLite فراهم می کند، اتاق توصیه می شود.

یک RoomDatabase برای انجام عملیات پایگاه داده به SQLiteDriver متکی است و یک پیاده سازی لازم است با استفاده از RoomDatabase.Builder.setDriver() پیکربندی شود. Room برای دسترسی مستقیم بیشتر به اتصالات پایگاه داده مدیریت شده RoomDatabase.useReaderConnection و RoomDatabase.useWriterConnection را فراهم می کند.

به چند پلتفرم Kotlin مهاجرت کنید

هر گونه استفاده از تماس های سطح پایین SQLite باید به همتایان SQLite Driver خود منتقل شود.

چند پلتفرم کاتلین

تراکنش را با استفاده از SQLiteConnection سطح پایین انجام دهید

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

یک پرس و جو را بدون نتیجه اجرا کنید

val connection: SQLiteConnection = ...
connection.execSQL("ALTER TABLE ...")

یک پرس و جو را با نتیجه اما بدون آرگومان اجرا کنید

val connection: SQLiteConnection = ...
connection.prepare("SELECT * FROM Pet").use { statement ->
  while (statement.step()) {
    // read columns
    statement.getInt(0)
    statement.getText(1)
  }
}

یک پرس و جو را با نتیجه و آرگومان اجرا کنید

connection.prepare("SELECT * FROM Pet WHERE id = ?").use { statement ->
  statement.bindInt(1, id)
  if (statement.step()) {
    // row found, read columns
  } else {
    // row not found
  }
}

فقط اندروید

تراکنش را با استفاده از SupportSQLiteDatabase انجام دهید

val database: SupportSQLiteDatabase = ...
database.beginTransaction()
try {
  // perform database operations in transaction
  database.setTransactionSuccessful()
} finally {
  database.endTransaction()
}

یک پرس و جو را بدون نتیجه اجرا کنید

val database: SupportSQLiteDatabase = ...
database.execSQL("ALTER TABLE ...")

یک پرس و جو را با نتیجه اما بدون آرگومان اجرا کنید

val database: SupportSQLiteDatabase = ...
database.query("SELECT * FROM Pet").use { cursor ->
  while (cusor.moveToNext()) {
    // read columns
    cursor.getInt(0)
    cursor.getString(1)
  }
}

یک پرس و جو را با نتیجه و آرگومان اجرا کنید

database.query("SELECT * FROM Pet WHERE id = ?", id).use { cursor ->
  if (cursor.moveToNext()) {
    // row found, read columns
  } else {
    // row not found
  }
}