কেএমপি-এর জন্য রুম ডেটাবেস তৈরি করুন

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

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

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

libs.versions.toml ফাইলে নির্ভরতাগুলো সংজ্ঞায়িত করুন:

[versions]
room3 = "3.1.0-alpha01"
sqlite = "2.7.1"
ksp = "<kotlinCompatibleKspVersion>"

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

# Optional SQLite Wrapper
androidx-room3-sqlite-wrapper = { module = "androidx.room3:room3-sqlite-wrapper", version.ref = "room3" }

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

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

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

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

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

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

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

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

Room স্কিমা ডিরেক্টরি নির্ধারণ করুন। অতিরিক্ত তথ্যের জন্য, Room Gradle Plugin ব্যবহার করে স্কিমার অবস্থান সেট করুন দেখুন।

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

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

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

// 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 ইনস্ট্যানশিয়েট করার জন্য আপনাকে একটি ডাটাবেস বিল্ডার সংজ্ঞায়িত করতে হবে। ফাইল-সিস্টেম এপিআই-এর ভিন্নতার কারণে, এপিআই-এর এই অংশটিই আপনাকে প্ল্যাটফর্ম-নির্দিষ্ট সোর্স সেটে সংজ্ঞায়িত করতে হবে।

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

অ্যান্ড্রয়েডে, সাধারণত 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)
}

জেভিএম ডেস্কটপ

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

// 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 ডেটাবেসের বাকি অংশ কনফিগার করতে পারবেন।