KMP এর জন্য SQLite সেট আপ করুন

androidx.sqlite লাইব্রেরিতে বেসিক ইমপ্লিমেন্টেশনের পাশাপাশি অ্যাবস্ট্রাক্ট ইন্টারফেসও রয়েছে, যা ব্যবহার করে SQLite অ্যাক্সেস করতে পারে এমন নিজস্ব লাইব্রেরি তৈরি করা যায়। আপনি Room লাইব্রেরিটি ব্যবহার করার কথাও ভাবতে পারেন, যা SQLite-এর উপর একটি অ্যাবস্ট্রাকশন লেয়ার প্রদান করে এবং SQLite-এর সম্পূর্ণ শক্তিকে কাজে লাগানোর পাশাপাশি আরও শক্তিশালী ডাটাবেস অ্যাক্সেসের সুযোগ করে দেয়।

নির্ভরতা সেট আপ করুন

আপনার KMP প্রোজেক্টে SQLite সেটআপ করতে, আপনার মডিউলের build.gradle.kts ফাইলে আর্টিফ্যাক্টগুলোর জন্য ডিপেন্ডেন্সিগুলো যোগ করুন:

[versions]
sqlite = "2.6.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" }

SQLite ড্রাইভার এপিআই

androidx.sqlite লাইব্রেরি গ্রুপগুলো SQLite লাইব্রেরির সাথে যোগাযোগের জন্য নিম্ন-স্তরের API প্রদান করে। এই API-গুলো androidx.sqlite:sqlite-bundled ব্যবহার করার সময় লাইব্রেরির মধ্যেই অন্তর্ভুক্ত থাকে, অথবা androidx.sqlite:sqlite-framework ব্যবহার করার সময় হোস্ট প্ল্যাটফর্ম, যেমন Android বা iOS-এ পাওয়া যায়। এই API-গুলো SQLite C API-এর মূল কার্যকারিতাকে নিবিড়ভাবে অনুসরণ করে।

তিনটি প্রধান ইন্টারফেস রয়েছে:

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

SQLite C API-এর মতোই এর সাধারণ ব্যবহার হলো:

  • ইনস্ট্যানসিয়েটেড SQLiteDriver ইমপ্লিমেন্টেশন ব্যবহার করে একটি ডাটাবেস কানেকশন খুলুন।
  • SQLiteConnection.prepare() ব্যবহার করে একটি SQL স্টেটমেন্ট প্রস্তুত করুন।
  • নিম্নলিখিত উপায়ে একটি 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

অ্যান্ড্রয়েড, আইওএস, ম্যাক, লিনাক্স এবং জেভিএম (ডেস্কটপ)

ব্যবহারের জন্য প্রস্তাবিত ইমপ্লিমেন্টেশনটি হলো androidx.sqlite:sqlite-bundled এ উপলব্ধ BundledSQLiteDriver । এতে সোর্স থেকে কম্পাইল করা SQLite লাইব্রেরি অন্তর্ভুক্ত রয়েছে, যা সমস্ত সমর্থিত KMP প্ল্যাটফর্ম জুড়ে সবচেয়ে আপ-টু-ডেট সংস্করণ এবং সামঞ্জস্যতা প্রদান করে।

SQLite ড্রাইভার এবং রুম

SQLite ডাটাবেসের সাথে নিম্ন-স্তরের ইন্টারঅ্যাকশনের জন্য ড্রাইভার এপিআইগুলো উপযোগী। SQLite-এ আরও শক্তিশালী অ্যাক্সেস প্রদানকারী একটি বৈশিষ্ট্য-সমৃদ্ধ লাইব্রেরির জন্য Room সুপারিশ করা হয়।

একটি RoomDatabase ডাটাবেস অপারেশন সম্পাদনের জন্য SQLiteDriver এর উপর নির্ভর করে এবং RoomDatabase.Builder.setDriver() ব্যবহার করে এর একটি ইমপ্লিমেন্টেশন কনফিগার করা আবশ্যক। ম্যানেজড ডাটাবেস কানেকশনগুলোতে আরও সরাসরি অ্যাক্সেসের জন্য Room, RoomDatabase.useReaderConnection এবং RoomDatabase.useWriterConnection প্রদান করে।

কোটলিন মাল্টিপ্ল্যাটফর্মে স্থানান্তরিত করুন

নিম্ন-স্তরের সাপোর্ট SQLite API কম্পোনেন্টগুলির (যেমন SupportSQLiteDatabase ইন্টারফেস) যেকোনো ব্যবহারকে সমতুল্য SQLite ড্রাইভার কম্পোনেন্টগুলিতে স্থানান্তরিত করতে হবে।

কোটলিন মাল্টিপ্ল্যাটফর্ম

নিম্ন-স্তরের 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
  }
}