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

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

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

আপনার KMP প্রোজেক্টে SQLite সেটআপ করতে, আপনার মডিউলের জন্য 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" }

SQLite ড্রাইভার APIs

androidx.sqlite লাইব্রেরি গোষ্ঠীগুলি androidx.sqlite:sqlite-bundled androidx.sqlite:sqlite-framework ব্যবহার করার সময় Android বা iOS-এর মতো হোস্ট প্ল্যাটফর্ম ব্যবহার করার সময় হয় লাইব্রেরিতে অন্তর্ভুক্ত SQLite লাইব্রেরির সাথে যোগাযোগের জন্য নিম্ন-স্তরের API অফার করে। APIs ঘনিষ্ঠভাবে 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()
}

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

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

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

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

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

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

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

নিম্ন স্তরের SQLite কলগুলির যেকোনো ব্যবহারকে তাদের 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
  }
}