KMP এর জন্য রুম ডেটাবেস সেট আপ করুন

রুম পারসিস্টেন্স লাইব্রেরি SQLite এর উপর একটি অ্যাবস্ট্রাকশন লেয়ার প্রদান করে যাতে SQLite এর পূর্ণ ক্ষমতা ব্যবহার করে আরও শক্তিশালী ডাটাবেস অ্যাক্সেস করা যায়। এই পৃষ্ঠাটি Room in Kotlin Multiplatform (KMP) প্রকল্প ব্যবহারের উপর আলোকপাত করে। Room ব্যবহার সম্পর্কে আরও তথ্যের জন্য, Room ব্যবহার করে স্থানীয় ডাটাবেসে ডেটা সংরক্ষণ করুন অথবা আমাদের অফিসিয়াল নমুনা দেখুন।

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

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

libs.versions.toml ফাইলে নির্ভরতা নির্ধারণ করুন:

[versions]
room = "2.8.4"
sqlite = "2.6.2"
ksp = "<kotlinCompatibleKspVersion>"

[libraries]
androidx-sqlite-bundled = { module = "androidx.sqlite:sqlite-bundled", version.ref = "sqlite" }
androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" }
androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" }

# Optional SQLite Wrapper available in version 2.8.0 and higher
androidx-room-sqlite-wrapper = { module = "androidx.room:room-sqlite-wrapper", version.ref = "room" }

[plugins]
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
androidx-room = { id = "androidx.room", version.ref = "room" }

রুম স্কিমা এবং KSP প্লাগইন কনফিগার করতে রুম গ্রেডল প্লাগইন যোগ করুন।

plugins {
  alias(libs.plugins.ksp)
  alias(libs.plugins.androidx.room)
}

রুম রানটাইম নির্ভরতা এবং বান্ডেল করা SQLite লাইব্রেরি যোগ করুন:

commonMain.dependencies {
  implementation(libs.androidx.room.runtime)
  implementation(libs.androidx.sqlite.bundled)
}

// Optional when using Room SQLite Wrapper
androidMain.dependencies {
  implementation(libs.androidx.room.sqlite.wrapper)
}

রুট dependencies ব্লকে KSP ডিপেন্ডেন্সি যোগ করুন। মনে রাখবেন যে আপনার অ্যাপ ব্যবহার করে এমন সমস্ত টার্গেট যোগ করতে হবে। আরও তথ্যের জন্য, KSP with Kotlin Multiplatform দেখুন।

dependencies {
    add("kspAndroid", libs.androidx.room.compiler)
    add("kspIosSimulatorArm64", libs.androidx.room.compiler)
    add("kspIosX64", libs.androidx.room.compiler)
    add("kspIosArm64", libs.androidx.room.compiler)
    // Add any other platform target you use in your project, for example kspDesktop
}

রুম স্কিমা ডিরেক্টরিটি সংজ্ঞায়িত করুন। অতিরিক্ত তথ্যের জন্য, রুম গ্রেডল প্লাগইন ব্যবহার করে স্কিমা অবস্থান সেট করুন দেখুন।

room {
    schemaDirectory("$projectDir/schemas")
}

ডাটাবেস ক্লাসগুলি সংজ্ঞায়িত করুন

আপনার শেয়ার্ড KMP মডিউলের কমন সোর্স সেটের ভিতরে @Database সহ DAO এবং সত্তা সহ একটি ডাটাবেস ক্লাস তৈরি করতে হবে। এই ক্লাসগুলিকে কমন সোর্সে স্থাপন করলে এগুলি সমস্ত টার্গেট প্ল্যাটফর্মে শেয়ার করা সম্ভব হবে।

// shared/src/commonMain/kotlin/Database.kt

@Database(entities = [TodoEntity::class], version = 1)
@ConstructedBy(AppDatabaseConstructor::class)
abstract class AppDatabase : RoomDatabase() {
  abstract fun getDao(): TodoDao
}

// The Room compiler generates the `actual` implementations.
@Suppress("KotlinNoActualForExpect")
expect object AppDatabaseConstructor : RoomDatabaseConstructor<AppDatabase> {
    override fun initialize(): AppDatabase
}

যখন আপনি RoomDatabaseConstructor ইন্টারফেস ব্যবহার করে একটি expect অবজেক্ট ঘোষণা করেন, তখন Room কম্পাইলার actual বাস্তবায়ন তৈরি করে। Android Studio নিম্নলিখিত সতর্কতা জারি করতে পারে, যা আপনি @Suppress("KotlinNoActualForExpect") ব্যবহার করে দমন করতে পারেন:

Expected object 'AppDatabaseConstructor' has no actual declaration in module`

এরপর, হয় একটি নতুন DAO ইন্টারফেস সংজ্ঞায়িত করুন অথবা বিদ্যমান একটিকে commonMain এ সরান:

// shared/src/commonMain/kotlin/TodoDao.kt

@Dao
interface TodoDao {
  @Insert
  suspend fun insert(item: TodoEntity)

  @Query("SELECT count(*) FROM TodoEntity")
  suspend fun count(): Int

  @Query("SELECT * FROM TodoEntity")
  fun getAllAsFlow(): Flow<List<TodoEntity>>
}

আপনার সত্ত্বাগুলিকে commonMain এ সংজ্ঞায়িত করুন বা সরান:

// shared/src/commonMain/kotlin/TodoEntity.kt

@Entity
data class TodoEntity(
  @PrimaryKey(autoGenerate = true) val id: Long = 0,
  val title: String,
  val content: String
)

প্ল্যাটফর্ম-নির্দিষ্ট ডাটাবেস নির্মাতা তৈরি করুন

প্রতিটি প্ল্যাটফর্মে Room ইন্সট্যান্টিয়েট করার জন্য আপনাকে একটি ডাটাবেস বিল্ডার সংজ্ঞায়িত করতে হবে। ফাইল সিস্টেম API-এর পার্থক্যের কারণে API-এর এটিই একমাত্র অংশ যা প্ল্যাটফর্ম-নির্দিষ্ট সোর্স সেটে থাকা প্রয়োজন।

অ্যান্ড্রয়েড

অ্যান্ড্রয়েডে, ডাটাবেসের অবস্থান সাধারণত Context.getDatabasePath() API এর মাধ্যমে পাওয়া যায়। ডাটাবেস ইনস্ট্যান্স তৈরি করতে, ডাটাবেস পাথের সাথে একটি Context উল্লেখ করুন।

// shared/src/androidMain/kotlin/Database.android.kt

fun getDatabaseBuilder(context: Context): RoomDatabase.Builder<AppDatabase> {
  val appContext = context.applicationContext
  val dbFile = appContext.getDatabasePath("my_room.db")
  return Room.databaseBuilder<AppDatabase>(
    context = appContext,
    name = dbFile.absolutePath
  )
}

আইওএস

iOS এ ডাটাবেস ইনস্ট্যান্স তৈরি করতে, NSFileManager ব্যবহার করে একটি ডাটাবেস পাথ প্রদান করুন, যা সাধারণত NSDocumentDirectory এ থাকে।

// shared/src/iosMain/kotlin/Database.ios.kt

fun getDatabaseBuilder(): RoomDatabase.Builder<AppDatabase> {
    val dbFilePath = documentDirectory() + "/my_room.db"
    return Room.databaseBuilder<AppDatabase>(
        name = dbFilePath,
    )
}

private fun documentDirectory(): String {
  val documentDirectory = NSFileManager.defaultManager.URLForDirectory(
    directory = NSDocumentDirectory,
    inDomain = NSUserDomainMask,
    appropriateForURL = null,
    create = false,
    error = null,
  )
  return requireNotNull(documentDirectory?.path)
}

JVM (ডেস্কটপ)

ডাটাবেস ইনস্ট্যান্স তৈরি করতে, জাভা বা কোটলিন এপিআই ব্যবহার করে একটি ডাটাবেস পাথ প্রদান করুন।

// shared/src/jvmMain/kotlin/Database.desktop.kt

fun getDatabaseBuilder(): RoomDatabase.Builder<AppDatabase> {
    val dbFile = File(System.getProperty("java.io.tmpdir"), "my_room.db")
    return Room.databaseBuilder<AppDatabase>(
        name = dbFile.absolutePath,
    )
}

ডাটাবেসটি চালু করুন

প্ল্যাটফর্ম-নির্দিষ্ট কনস্ট্রাক্টরগুলির একটি থেকে RoomDatabase.Builder পাওয়ার পর, আপনি প্রকৃত ডাটাবেস ইনস্ট্যান্সিয়েশনের সাথে সাথে বাকি Room ডাটাবেসকে সাধারণ কোডে কনফিগার করতে পারবেন।

// shared/src/commonMain/kotlin/Database.kt

fun getRoomDatabase(
    builder: RoomDatabase.Builder<AppDatabase>
): AppDatabase {
  return builder
      .setDriver(BundledSQLiteDriver())
      .setQueryCoroutineContext(Dispatchers.IO)
      .build()
}

একটি SQLite ড্রাইভার নির্বাচন করুন

পূর্ববর্তী কোড স্নিপেটটি setDriver বিল্ডার ফাংশনকে কল করে যা Room ডাটাবেসের কোন SQLite ড্রাইভার ব্যবহার করা উচিত তা নির্ধারণ করে। এই ড্রাইভারগুলি লক্ষ্য প্ল্যাটফর্মের উপর ভিত্তি করে পৃথক হয়। পূর্ববর্তী কোড স্নিপেটগুলি BundledSQLiteDriver ব্যবহার করে। এটি হল প্রস্তাবিত ড্রাইভার যার মধ্যে উৎস থেকে সংকলিত SQLite অন্তর্ভুক্ত রয়েছে, যা সমস্ত প্ল্যাটফর্ম জুড়ে SQLite এর সবচেয়ে সামঞ্জস্যপূর্ণ এবং আপ-টু-ডেট সংস্করণ সরবরাহ করে।

যদি আপনি OS-প্রদত্ত SQLite ব্যবহার করতে চান, তাহলে প্ল্যাটফর্ম-নির্দিষ্ট সোর্স সেটগুলিতে setDriver API ব্যবহার করুন যা একটি প্ল্যাটফর্ম-নির্দিষ্ট ড্রাইভার নির্দিষ্ট করে। উপলব্ধ ড্রাইভার বাস্তবায়নের বিবরণের জন্য ড্রাইভার বাস্তবায়ন দেখুন। আপনি নিম্নলিখিতগুলির যেকোনো একটি ব্যবহার করতে পারেন:

NativeSQLiteDriver ব্যবহার করার জন্য, আপনাকে একটি লিঙ্কার বিকল্প -lsqlite3 প্রদান করতে হবে যাতে iOS অ্যাপটি SQLite সিস্টেমের সাথে গতিশীলভাবে লিঙ্ক করে।

// shared/build.gradle.kts

kotlin {
    listOf(
        iosX64(),
        iosArm64(),
        iosSimulatorArm64()
    ).forEach { iosTarget ->
        iosTarget.binaries.framework {
            baseName = "TodoApp"
            isStatic = true
            // Required when using NativeSQLiteDriver
            linkerOpts.add("-lsqlite3")
        }
    }
}

একটি Coroutine প্রসঙ্গ সেট করুন (ঐচ্ছিক)

অ্যান্ড্রয়েডে একটি RoomDatabase অবজেক্ট ঐচ্ছিকভাবে RoomDatabase.Builder.setQueryExecutor() ব্যবহার করে শেয়ার করা অ্যাপ্লিকেশন এক্সিকিউটারগুলির সাথে কনফিগার করা যেতে পারে যাতে ডাটাবেস অপারেশন করা যায়।

যেহেতু এক্সিকিউটরগুলি KMP সামঞ্জস্যপূর্ণ নয়, তাই Room এর setQueryExecutor() API commonMain তে উপলব্ধ নয়। পরিবর্তে RoomDatabase অবজেক্টটি CoroutineContext দিয়ে কনফিগার করতে হবে, যা RoomDatabase.Builder.setCoroutineContext() ব্যবহার করে সেট করা যেতে পারে। যদি কোনও প্রসঙ্গ সেট না করা থাকে, তাহলে RoomDatabase অবজেক্টটি Dispatchers.IO ব্যবহার করে ডিফল্ট হবে।

ক্ষুদ্রীকরণ এবং অস্পষ্টতা

যদি প্রকল্পটি ক্ষুদ্রাকৃতির বা অস্পষ্ট হয় তবে আপনাকে নিম্নলিখিত ProGuard নিয়মটি অন্তর্ভুক্ত করতে হবে যাতে Room ডাটাবেস সংজ্ঞার জেনারেট করা বাস্তবায়ন খুঁজে পেতে পারে:

-keep class * extends androidx.room.RoomDatabase { <init>(); }

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

রুম মূলত একটি অ্যান্ড্রয়েড লাইব্রেরি হিসেবে তৈরি করা হয়েছিল এবং পরে API সামঞ্জস্যের উপর জোর দিয়ে KMP তে স্থানান্তরিত করা হয়েছিল। রুমের KMP সংস্করণটি প্ল্যাটফর্ম এবং অ্যান্ড্রয়েড-নির্দিষ্ট সংস্করণের মধ্যে কিছুটা আলাদা। এই পার্থক্যগুলি নিম্নরূপ তালিকাভুক্ত এবং বর্ণনা করা হয়েছে।

সাপোর্ট SQLite থেকে SQLite ড্রাইভারে স্থানান্তর করুন

androidx.sqlite.dbSupportSQLiteDatabase এবং অন্যান্য API-এর যেকোনো ব্যবহার SQLite ড্রাইভার API-এর সাথে পুনঃফ্যাক্টর করা প্রয়োজন, কারণ androidx.sqlite.db এর API গুলি শুধুমাত্র Android-এর জন্য (KMP প্যাকেজ থেকে আলাদা প্যাকেজটি লক্ষ্য করুন)।

ব্যাকওয়ার্ড কম্প্যাটিবিলিটির জন্য, এবং যতক্ষণ পর্যন্ত RoomDatabase একটি SupportSQLiteOpenHelper.Factory দিয়ে কনফিগার করা থাকে (উদাহরণস্বরূপ, কোনও SQLiteDriver সেট করা থাকে না), ততক্ষণ Room 'সামঞ্জস্যতা মোডে' আচরণ করে যেখানে Support SQLite এবং SQLite ড্রাইভার API উভয়ই প্রত্যাশা অনুযায়ী কাজ করে। এটি ক্রমবর্ধমান মাইগ্রেশন সক্ষম করে যাতে আপনাকে একক পরিবর্তনে আপনার সমস্ত Support SQLite ব্যবহার SQLite ড্রাইভারে রূপান্তর করতে না হয়।

রুম SQLite র‍্যাপার ব্যবহার করুন (ঐচ্ছিক)

androidx.room:room-sqlite-wrapper আর্টিফ্যাক্টটি মাইগ্রেশনের সময় SQLiteDriver এবং SupportSQLiteDatabase মধ্যে সেতুবন্ধন তৈরির জন্য API প্রদান করে।

SQLiteDriver দিয়ে কনফিগার করা RoomDatabase থেকে SupportSQLiteDatabase পেতে, নতুন এক্সটেনশন ফাংশন RoomDatabase.getSupportWrapper() ব্যবহার করুন। এই সামঞ্জস্যপূর্ণ র‍্যাপার SupportSQLiteDatabase (প্রায়শই RoomDatabase.openHelper.writableDatabase থেকে প্রাপ্ত) এর বিদ্যমান ব্যবহার বজায় রাখতে সাহায্য করে, বিশেষ করে SQLiteDriver গ্রহণ করার সময়, বিশেষ করে SupportSQLite API ব্যবহার করে এমন কোডবেসগুলির জন্য যারা BundledSQLiteDriver ব্যবহার করতে চান।

মাইগ্রেশন সাবক্লাস রূপান্তর করুন

মাইগ্রেশন সাবক্লাসগুলিকে SQLite ড্রাইভার প্রতিরূপে স্থানান্তরিত করতে হবে:

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

মাইগ্রেশন উপশ্রেণী

object Migration_1_2 : Migration(1, 2) {
  override fun migrate(connection: SQLiteConnection) {
    // …
  }
}

অটো মাইগ্রেশন স্পেসিফিকেশন সাবক্লাস

class AutoMigrationSpec_1_2 : AutoMigrationSpec {
  override fun onPostMigrate(connection: SQLiteConnection) {
    // …
  }
}

শুধুমাত্র অ্যান্ড্রয়েড ব্যবহারকারীদের জন্য

মাইগ্রেশন উপশ্রেণী

object Migration_1_2 : Migration(1, 2) {
  override fun migrate(db: SupportSQLiteDatabase) {
    // …
  }
}

অটো মাইগ্রেশন স্পেসিফিকেশন সাবক্লাস

class AutoMigrationSpec_1_2 : AutoMigrationSpec {
  override fun onPostMigrate(db: SupportSQLiteDatabase) {
    // …
  }
}

ডাটাবেস কলব্যাক রূপান্তর করুন

ডাটাবেস কলব্যাকগুলিকে SQLite ড্রাইভার প্রতিরূপে স্থানান্তরিত করতে হবে:

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

object MyRoomCallback : RoomDatabase.Callback() {
  override fun onCreate(connection: SQLiteConnection) {
    // …
  }

  override fun onDestructiveMigration(connection: SQLiteConnection) {
    // …
  }

  override fun onOpen(connection: SQLiteConnection) {
    // …
  }
}

শুধুমাত্র অ্যান্ড্রয়েড ব্যবহারকারীদের জন্য

object MyRoomCallback : RoomDatabase.Callback() {
  override fun onCreate(db: SupportSQLiteDatabase) {
    // …
  }

  override fun onDestructiveMigration(db: SupportSQLiteDatabase) {
    // …
  }

  override fun onOpen(db: SupportSQLiteDatabase) {
    // …
  }
}

@RawQuery DAO ফাংশন রূপান্তর করুন

@RawQuery দিয়ে টীকাযুক্ত ফাংশনগুলি যা অ্যান্ড্রয়েড নয় এমন প্ল্যাটফর্মের জন্য কম্পাইল করা হয়, তাদের SupportSQLiteQuery এর পরিবর্তে RoomRawQuery ধরণের একটি প্যারামিটার ঘোষণা করতে হবে।

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

কাঁচা কোয়েরি সংজ্ঞায়িত করুন

@Dao
interface TodoDao {
  @RawQuery
  suspend fun getTodos(query: RoomRawQuery): List<TodoEntity>
}

রানটাইমে একটি কোয়েরি তৈরি করতে একটি RoomRawQuery ব্যবহার করা যেতে পারে:

suspend fun AppDatabase.getTodosWithLowercaseTitle(title: String): List<TodoEntity> {
    val query = RoomRawQuery(
        sql = "SELECT * FROM TodoEntity WHERE title = ?",
        onBindStatement = {
            it.bindText(1, title.lowercase())
        }
    )

    return todoDao().getTodos(query)
}

শুধুমাত্র অ্যান্ড্রয়েড ব্যবহারকারীদের জন্য

কাঁচা কোয়েরি সংজ্ঞায়িত করুন

@Dao
interface TodoDao {
  @RawQuery
  suspend fun getTodos(query: SupportSQLiteQuery): List<TodoEntity>
}

রানটাইমে একটি কোয়েরি তৈরি করতে একটি SimpleSQLiteQuery ব্যবহার করা যেতে পারে:

suspend fun AndroidOnlyDao.getTodosWithLowercaseTitle(title: String): List<TodoEntity> {
  val query = SimpleSQLiteQuery(
      query = "SELECT * FROM TodoEntity WHERE title = ?",
      bindArgs = arrayOf(title.lowercase())
  )
  return getTodos(query)
}

ব্লকিং DAO ফাংশন রূপান্তর করুন

Kotlin একাধিক প্ল্যাটফর্মের জন্য বৈশিষ্ট্য সমৃদ্ধ অ্যাসিঙ্ক্রোনাস kotlinx.coroutines লাইব্রেরি থেকে Room সুবিধা লাভ করে। সর্বোত্তম কার্যকারিতার জন্য, KMP প্রকল্পে সংকলিত DAO-গুলির জন্য suspend ফাংশন প্রয়োগ করা হয়, বিদ্যমান কোডবেসের সাথে পিছনের দিকে সামঞ্জস্য বজায় রাখার জন্য androidMain এ বাস্তবায়িত DAO গুলি বাদ দিয়ে। Room for KMP ব্যবহার করার সময়, নন-অ্যান্ড্রয়েড প্ল্যাটফর্মের জন্য সংকলিত সমস্ত DAO ফাংশন suspend ফাংশন হওয়া প্রয়োজন।

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

কোয়েরি স্থগিত করা হচ্ছে

@Query("SELECT * FROM Todo")
suspend fun getAllTodos(): List<Todo>

লেনদেন স্থগিত করা হচ্ছে

@Transaction
suspend fun transaction() {  }

শুধুমাত্র অ্যান্ড্রয়েড ব্যবহারকারীদের জন্য

কোয়েরি ব্লক করা হচ্ছে

@Query("SELECT * FROM Todo")
fun getAllTodos(): List<Todo>

লেনদেন ব্লক করা

@Transaction
fun blockingTransaction() {  }

প্রতিক্রিয়াশীল প্রকারগুলিকে প্রবাহে রূপান্তর করুন

সব DAO ফাংশন সাসপেন্ড ফাংশন হওয়ার প্রয়োজন নেই। DAO ফাংশন যা LiveData বা RxJava's Flowable মতো রিঅ্যাকটিভ টাইপ রিটার্ন করে, সেগুলোকে সাসপেন্ড ফাংশনে রূপান্তর করা উচিত নয়। তবে, কিছু টাইপ, যেমন LiveData , KMP সামঞ্জস্যপূর্ণ নয়। রিঅ্যাকটিভ রিটার্ন টাইপ সহ DAO ফাংশনগুলিকে কোরোটিন ফ্লোতে স্থানান্তরিত করতে হবে।

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

প্রতিক্রিয়াশীল প্রকার Flows

@Query("SELECT * FROM Todo")
fun getTodosFlow(): Flow<List<Todo>>

শুধুমাত্র অ্যান্ড্রয়েড ব্যবহারকারীদের জন্য

LiveData বা আরএক্সজাভার Flowable মতো প্রতিক্রিয়াশীল প্রকারগুলি

@Query("SELECT * FROM Todo")
fun getTodosLiveData(): LiveData<List<Todo>>

লেনদেন API গুলিকে রূপান্তর করুন

রুম কেএমপির জন্য ডাটাবেস লেনদেন এপিআইগুলি লেখা ( useWriterConnection ) এবং পড়া ( useReaderConnection ) লেনদেনের মধ্যে পার্থক্য করতে পারে।

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

val database: RoomDatabase = 
database.useWriterConnection { transactor ->
  transactor.immediateTransaction {
    // perform database operations in transaction
  }
}

শুধুমাত্র অ্যান্ড্রয়েড ব্যবহারকারীদের জন্য

val database: RoomDatabase = 
database.withTransaction {
  // perform database operations in transaction
}

লেনদেন লিখুন

একাধিক কোয়েরি যাতে পরমাণুভাবে ডেটা লেখে তা নিশ্চিত করতে write transactions ব্যবহার করুন, যাতে পাঠকরা ধারাবাহিকভাবে ডেটা অ্যাক্সেস করতে পারেন। আপনি useWriterConnection ব্যবহার করে তিনটি লেনদেনের যেকোনো একটির সাথে এটি করতে পারেন:

  • immediateTransaction : Write-Ahead Logging (WAL) মোডে (ডিফল্ট), এই ধরণের লেনদেন শুরু হওয়ার সাথে সাথে একটি লক হয়ে যায়, কিন্তু পাঠকরা পড়া চালিয়ে যেতে পারেন। বেশিরভাগ ক্ষেত্রে এটিই পছন্দের পছন্দ।

  • deferredTransaction : প্রথম লেখার বিবৃতি না দেওয়া পর্যন্ত লেনদেনটি লক পাবে না। লেনদেনের মধ্যে লেখার অপারেশনের প্রয়োজন হবে কিনা তা নিশ্চিত না হলে এই ধরণের লেনদেনকে অপ্টিমাইজেশন হিসেবে ব্যবহার করুন। উদাহরণস্বরূপ, যদি আপনি প্লেলিস্টের নাম দিয়ে প্লেলিস্ট থেকে গান মুছে ফেলার জন্য লেনদেন শুরু করেন এবং প্লেলিস্টটি বিদ্যমান না থাকে, তাহলে কোনও লেখা (মুছে ফেলা) অপারেশনের প্রয়োজন নেই।

  • exclusiveTransaction : এই মোডটি WAL মোডে immediateTransaction এর মতোই আচরণ করে। অন্যান্য জার্নালিং মোডে, এটি লেনদেন চলাকালীন অন্যান্য ডাটাবেস সংযোগগুলিকে ডাটাবেস পড়তে বাধা দেয়।

লেনদেন পড়ুন

ডাটাবেস থেকে ধারাবাহিকভাবে একাধিকবার পড়ার জন্য read লেনদেন ব্যবহার করুন। উদাহরণস্বরূপ, যখন আপনার দুটি বা ততোধিক পৃথক প্রশ্ন থাকে এবং আপনি JOIN ধারা ব্যবহার করেন না। পাঠক সংযোগে শুধুমাত্র বিলম্বিত লেনদেন অনুমোদিত। পাঠক সংযোগে তাৎক্ষণিক বা এক্সক্লুসিভ লেনদেন শুরু করার চেষ্টা করলে একটি ব্যতিক্রম ঘটবে, কারণ এগুলিকে 'লেখার' ক্রিয়াকলাপ হিসাবে বিবেচনা করা হয়।

val database: RoomDatabase = 
database.useReaderConnection { transactor ->
  transactor.deferredTransaction {
      // perform database operations in transaction
  }
}

কোটলিন মাল্টিপ্ল্যাটফর্মে উপলব্ধ নয়

অ্যান্ড্রয়েডের জন্য উপলব্ধ কিছু API কোটলিন মাল্টিপ্ল্যাটফর্মে উপলব্ধ নয়।

কলব্যাক জিজ্ঞাসা করুন

ক্যোয়ারী কলব্যাক কনফিগার করার জন্য নিম্নলিখিত API গুলি সাধারণভাবে উপলব্ধ নয় এবং তাই অ্যান্ড্রয়েড ছাড়া অন্য প্ল্যাটফর্মগুলিতে অনুপলব্ধ।

  • RoomDatabase.Builder.setQueryCallback
  • RoomDatabase.QueryCallback

আমরা রুমের ভবিষ্যতের সংস্করণে কোয়েরি কলব্যাকের জন্য সমর্থন যোগ করার ইচ্ছা রাখি।

একটি কোয়েরি কলব্যাক সহ একটি RoomDatabase কনফিগার করার API RoomDatabase.Builder.setQueryCallback এবং কলব্যাক ইন্টারফেস RoomDatabase.QueryCallback সাধারণভাবে উপলব্ধ নয় এবং তাই Android ছাড়া অন্য প্ল্যাটফর্মগুলিতে উপলব্ধ নয়।

অটো ক্লোজিং ডাটাবেস

টাইমআউটের পরে স্বয়ংক্রিয়ভাবে বন্ধ করার API, RoomDatabase.Builder.setAutoCloseTimeout , শুধুমাত্র অ্যান্ড্রয়েডে উপলব্ধ এবং অন্যান্য প্ল্যাটফর্মে উপলব্ধ নয়।

প্রাক-প্যাকেজ ডাটাবেস

বিদ্যমান ডাটাবেস (অর্থাৎ একটি প্রি-প্যাকেজড ডাটাবেস) ব্যবহার করে একটি RoomDatabase তৈরি করার জন্য নিম্নলিখিত API গুলি সাধারণভাবে উপলব্ধ নয় এবং তাই Android ছাড়া অন্য কোনও প্ল্যাটফর্মে উপলব্ধ নয়। এই API গুলি হল:

  • RoomDatabase.Builder.createFromAsset
  • RoomDatabase.Builder.createFromFile
  • RoomDatabase.Builder.createFromInputStream
  • RoomDatabase.PrepackagedDatabaseCallback

আমরা রুমের ভবিষ্যতের সংস্করণে প্রি-প্যাকেজড ডাটাবেসের জন্য সমর্থন যোগ করার ইচ্ছা রাখি।

মাল্টি-ইনস্ট্যান্স অবৈধকরণ

মাল্টি-ইনস্ট্যান্স অবৈধকরণ সক্ষম করার API, RoomDatabase.Builder.enableMultiInstanceInvalidation শুধুমাত্র অ্যান্ড্রয়েডে উপলব্ধ এবং সাধারণ বা অন্যান্য প্ল্যাটফর্মে উপলব্ধ নয়।

{% অক্ষরে অক্ষরে %} {% এন্ডভারব্যাটিম %} {% অক্ষরে অক্ষরে %} {% এন্ডভারব্যাটিম %}