रूम (Kotlin मल्टीप्लैटफ़ॉर्म)

Room परसिस्टेंस लाइब्रेरी, SQLite को लेकर एक ऐब्स्ट्रैक्शन लेयर उपलब्ध कराती है, ताकि डेटाबेस को ज़्यादा अच्छे से ऐक्सेस किया जा सके. इस पेज पर, Kotlin Multiplatform (KMP) प्रोजेक्ट में Room का इस्तेमाल करने के बारे में बताया गया है. Room का इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, Room का इस्तेमाल करके, डेटा को किसी स्थानीय डेटाबेस में सेव करना या हमारे आधिकारिक सैंपल देखें.

डिपेंडेंसी सेट अप करना

अपने KMP प्रोजेक्ट में Room को सेटअप करने के लिए, अपने KMP मॉड्यूल की build.gradle.kts फ़ाइल में आर्टफ़ैक्ट के लिए डिपेंडेंसी जोड़ें.

libs.versions.toml फ़ाइल में डिपेंडेंसी तय करें:

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

Room के स्कीमा और KSP प्लगिन को कॉन्फ़िगर करने के लिए, Room Gradle प्लगिन जोड़ें

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

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

KSP डिपेंडेंसी को root dependencies ब्लॉक में जोड़ें. ध्यान दें कि आपको वे सभी टारगेट जोड़ने होंगे जिनका इस्तेमाल आपका ऐप्लिकेशन करता है. ज़्यादा जानकारी के लिए, Kotlin Multiplatform के साथ KSP देखें.

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 Gradle प्लगिन का इस्तेमाल करके स्कीमा की जगह सेट करना लेख पढ़ें.

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

डेटाबेस क्लास तय करना

आपको अपने शेयर किए गए KMP मॉड्यूल के सामान्य सोर्स सेट में, DAOs और इकाइयों के साथ-साथ @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
}

expect इंटरफ़ेस के साथ expect ऑब्जेक्ट का एलान करने पर, Room कंपाइलर actual लागू करने की प्रोसेस जनरेट करता है.RoomDatabaseConstructor Android Studio यह चेतावनी दिखा सकता है. @Suppress("KotlinNoActualForExpect") का इस्तेमाल करके, इस चेतावनी को छिपाया जा सकता है:

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

इसके बाद, नया डीएओ इंटरफ़ेस तय करें या किसी मौजूदा इंटरफ़ेस को 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 को इंस्टैंशिएट करने के लिए, डेटाबेस बिल्डर को तय करना होगा. एपीआई का सिर्फ़ यही हिस्सा, प्लैटफ़ॉर्म के हिसाब से सोर्स सेट में होना चाहिए. ऐसा फ़ाइल सिस्टम एपीआई में अंतर की वजह से होता है.

Android

Android पर, डेटाबेस की जगह की जानकारी आम तौर पर 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

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

जेवीएम (डेस्कटॉप)

डेटाबेस इंस्टेंस बनाने के लिए, Java या Kotlin API का इस्तेमाल करके डेटाबेस का पाथ दें.

// 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 का सबसे नया और एक जैसा वर्शन उपलब्ध कराता है.

अगर आपको ओएस के ज़रिए उपलब्ध कराए गए 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")
        }
    }
}

कोरूटीन कॉन्टेक्स्ट सेट करना (ज़रूरी नहीं)

Android पर मौजूद RoomDatabase ऑब्जेक्ट को, RoomDatabase.Builder.setQueryExecutor() का इस्तेमाल करके शेयर किए गए ऐप्लिकेशन एक्ज़ीक्यूटर के साथ कॉन्फ़िगर किया जा सकता है. इससे डेटाबेस से जुड़ी कार्रवाइयां की जा सकती हैं.

एक्ज़ीक्यूटर, KMP के साथ काम नहीं करते. इसलिए, Room का setQueryExecutor() एपीआई, commonMain में उपलब्ध नहीं है. इसके बजाय, RoomDatabase ऑब्जेक्ट को CoroutineContext के साथ कॉन्फ़िगर किया जाना चाहिए. इसे RoomDatabase.Builder.setCoroutineContext() का इस्तेमाल करके सेट किया जा सकता है. अगर कोई कॉन्टेक्स्ट सेट नहीं किया गया है, तो RoomDatabase ऑब्जेक्ट डिफ़ॉल्ट रूप से Dispatchers.IO का इस्तेमाल करेगा.

कोड का साइज़ कम करना और उसे अस्पष्ट बनाना

अगर प्रोजेक्ट को छोटा किया गया है या उसमें कोड को छिपाया गया है, तो आपको ProGuard का यह नियम शामिल करना होगा, ताकि Room डेटाबेस की परिभाषा के जनरेट किए गए इंप्लीमेंटेशन को ढूंढ सके:

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

Kotlin Multiplatform पर माइग्रेट करना

Room को मूल रूप से Android लाइब्रेरी के तौर पर डेवलप किया गया था. बाद में, इसे KMP पर माइग्रेट कर दिया गया. इस दौरान, एपीआई के साथ काम करने की सुविधा पर फ़ोकस किया गया. Room का KMP वर्शन, प्लैटफ़ॉर्म के हिसाब से और Android के लिए उपलब्ध वर्शन से थोड़ा अलग होता है. इन दोनों के बीच के फ़र्क़ यहां दिए गए हैं.

Support SQLite से SQLite Driver पर माइग्रेट करना

androidx.sqlite.db में SupportSQLiteDatabase और अन्य एपीआई के सभी इस्तेमाल को SQLite ड्राइवर एपीआई के साथ फिर से फ़ैक्टर करने की ज़रूरत है, क्योंकि androidx.sqlite.db में मौजूद एपीआई सिर्फ़ Android के लिए हैं. ध्यान दें कि यह KMP पैकेज से अलग पैकेज है.

पुराने सिस्टम के साथ काम करने की सुविधा के लिए, और जब तक RoomDatabase को SupportSQLiteOpenHelper.Factory के साथ कॉन्फ़िगर किया जाता है (उदाहरण के लिए, कोई SQLiteDriver सेट नहीं है), तब तक Room, 'compatibility mode' में काम करता है. इसमें Support SQLite और SQLite Driver API, दोनों उम्मीद के मुताबिक काम करते हैं. इससे इंक्रीमेंटल माइग्रेशन की सुविधा चालू हो जाती है, ताकि आपको एक बार में Support SQLite के सभी इस्तेमाल को SQLite Driver में बदलने की ज़रूरत न पड़े.

माइग्रेशन की सबक्लास को बदलें

माइग्रेशन की सबक्लास को SQLite ड्राइवर के काउंटरपार्ट में माइग्रेट करना होगा:

Kotlin Multiplatform

माइग्रेशन की उपश्रेणियां

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

अपने-आप माइग्रेट होने की सुविधा से जुड़ी खास बातों की सबक्लास

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

सिर्फ़ Android के लिए

माइग्रेशन की उपश्रेणियां

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

अपने-आप माइग्रेट होने की सुविधा से जुड़ी खास बातों की सबक्लास

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

डेटाबेस कॉलबैक को बदलें

डेटाबेस के कॉल बैक को SQLite ड्राइवर के काउंटरपार्ट में माइग्रेट करना होगा:

Kotlin Multiplatform

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

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

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

सिर्फ़ Android के लिए

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

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

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

@RawQuery DAO फ़ंक्शन को बदलना

@RawQuery एनोटेशन वाले ऐसे फ़ंक्शन जिन्हें Android के अलावा किसी अन्य प्लैटफ़ॉर्म के लिए कंपाइल किया गया है उन्हें SupportSQLiteQuery के बजाय RoomRawQuery टाइप के पैरामीटर का एलान करना होगा.

Kotlin Multiplatform

रॉ क्वेरी के बारे में जानकारी

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

सिर्फ़ Android के लिए

रॉ क्वेरी के बारे में जानकारी

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

ब्लॉक करने वाले डीएओ फ़ंक्शन को बदलना

Room को एसिंक्रोनस kotlinx.coroutines लाइब्रेरी की सुविधाओं का फ़ायदा मिलता है. यह लाइब्रेरी, Kotlin कई प्लैटफ़ॉर्म के लिए उपलब्ध कराता है. बेहतर तरीके से काम करने के लिए, suspend फ़ंक्शन, KMP प्रोजेक्ट में कंपाइल किए गए DAO के लिए लागू किए जाते हैं. हालांकि, androidMain में लागू किए गए DAO को छोड़कर, ताकि मौजूदा कोडबेस के साथ काम करने की सुविधा बनी रहे. KMP के लिए Room का इस्तेमाल करते समय, Android के अलावा अन्य प्लैटफ़ॉर्म के लिए कंपाइल किए गए सभी DAO फ़ंक्शन, suspend फ़ंक्शन होने चाहिए.

Kotlin Multiplatform

क्वेरी निलंबित करना

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

लेन-देन को निलंबित करना

@Transaction
suspend fun transaction() {  }

सिर्फ़ Android के लिए

क्वेरी ब्लॉक करना

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

लेन-देन ब्लॉक करना

@Transaction
fun blockingTransaction() {  }

प्रतिक्रियाशील टाइप को फ़्लो में बदलना

यह ज़रूरी नहीं है कि डीएओ के सभी फ़ंक्शन, सस्पेंड करने वाले फ़ंक्शन हों. DAO फ़ंक्शन, LiveData या RxJava के Flowable जैसे रिएक्टिव टाइप दिखाते हैं. इन्हें सस्पेंड फ़ंक्शन में नहीं बदला जाना चाहिए. हालांकि, कुछ टाइप, जैसे कि LiveData, KMP के साथ काम नहीं करते. DAO फ़ंक्शन के लिए, रिएक्टिव रिटर्न टाइप को कोरूटीन फ़्लो में माइग्रेट करना ज़रूरी है.

Kotlin Multiplatform

रिऐक्टिव टाइप Flows

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

सिर्फ़ Android के लिए

रिऐक्टिव टाइप, जैसे कि LiveData या RxJava का Flowable

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

लेन-देन वाले एपीआई को बदलना

Room KMP के लिए डेटाबेस ट्रांज़ैक्शन एपीआई, लिखने (useWriterConnection) और पढ़ने (useReaderConnection) के ट्रांज़ैक्शन के बीच अंतर कर सकते हैं.

Kotlin Multiplatform

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

सिर्फ़ Android के लिए

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

लेन-देन की जानकारी सेव करने की अनुमति दें

लिखने के लेन-देन का इस्तेमाल करें, ताकि कई क्वेरी एक साथ डेटा लिख सकें. इससे, पढ़ने वाले लोग लगातार डेटा ऐक्सेस कर पाएंगे. इसके लिए, useWriterConnection का इस्तेमाल किया जा सकता है. साथ ही, तीन तरह के लेन-देन में से किसी एक का इस्तेमाल किया जा सकता है:

  • immediateTransaction: Write-Ahead Logging (WAL) मोड (डिफ़ॉल्ट) में, इस तरह का लेन-देन शुरू होने पर लॉक हो जाता है. हालांकि, रीडर इसे पढ़ना जारी रख सकते हैं. ज़्यादातर मामलों में, यह विकल्प सबसे सही होता है.

  • deferredTransaction: लेन-देन तब तक लॉक नहीं होगा, जब तक पहला राइट स्टेटमेंट नहीं आ जाता. इस तरह के लेन-देन का इस्तेमाल ऑप्टिमाइज़ेशन के तौर पर तब करें, जब आपको यह पक्का न हो कि लेन-देन के दौरान राइट ऑपरेशन की ज़रूरत होगी या नहीं. उदाहरण के लिए, अगर आपने किसी प्लेलिस्ट से गाने मिटाने के लिए लेन-देन शुरू किया है और आपने सिर्फ़ प्लेलिस्ट का नाम दिया है और वह प्लेलिस्ट मौजूद नहीं है, तो मिटाने का कोई भी ऑपरेशन नहीं किया जाएगा.

  • exclusiveTransaction: यह मोड, WAL मोड में immediateTransaction की तरह ही काम करता है. अन्य जर्नलिंग मोड में, यह ट्रांज़ैक्शन के दौरान अन्य डेटाबेस कनेक्शन को डेटाबेस पढ़ने से रोकता है.

लेन-देन की जानकारी पढ़ना

डेटाबेस से कई बार लगातार डेटा पढ़ने के लिए, रीड ट्रांज़ैक्शन का इस्तेमाल करें. उदाहरण के लिए, जब आपके पास दो या उससे ज़्यादा अलग-अलग क्वेरी हों और आपने JOIN क्लॉज़ का इस्तेमाल न किया हो. रीडर कनेक्शन में सिर्फ़ ऐसे लेन-देन की अनुमति है जिनके लिए बाद में पेमेंट किया जाता है. रीडर कनेक्शन में तुरंत या खास लेन-देन शुरू करने की कोशिश करने पर, एक अपवाद दिखेगा. ऐसा इसलिए, क्योंकि इन्हें 'लिखें' कार्रवाइयां माना जाता है.

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

Kotlin Multiplatform में उपलब्ध नहीं है

Android के लिए उपलब्ध कुछ एपीआई, Kotlin Multiplatform में उपलब्ध नहीं हैं.

क्वेरी कॉलबैक

क्वेरी कॉलबैक को कॉन्फ़िगर करने के लिए, यहां दिए गए एपीआई सामान्य तौर पर उपलब्ध नहीं हैं. इसलिए, ये Android के अलावा अन्य प्लैटफ़ॉर्म पर उपलब्ध नहीं हैं.

  • RoomDatabase.Builder.setQueryCallback
  • RoomDatabase.QueryCallback

हम Room के आने वाले वर्शन में, क्वेरी कॉलबैक की सुविधा जोड़ने का प्लान बना रहे हैं.

क्वेरी कॉलबैक RoomDatabase के साथ RoomDatabase.Builder.setQueryCallback कॉलबैक इंटरफ़ेस को कॉन्फ़िगर करने वाला एपीआई RoomDatabase.QueryCallback, सामान्य तौर पर उपलब्ध नहीं है. इसलिए, यह Android के अलावा अन्य प्लैटफ़ॉर्म पर भी उपलब्ध नहीं है.

डेटाबेस अपने-आप बंद होने की सुविधा

टाइम आउट के बाद अपने-आप बंद होने की सुविधा चालू करने वाला एपीआई, RoomDatabase.Builder.setAutoCloseTimeout, सिर्फ़ Android पर उपलब्ध है. यह अन्य प्लैटफ़ॉर्म पर उपलब्ध नहीं है.

प्री-पैकेज डेटाबेस

मौजूदा डेटाबेस (जैसे, पहले से पैकेज किया गया डेटाबेस) का इस्तेमाल करके RoomDatabase बनाने के लिए, यहां दिए गए एपीआई आम तौर पर उपलब्ध नहीं होते. इसलिए, ये Android के अलावा अन्य प्लैटफ़ॉर्म पर भी उपलब्ध नहीं होते. ये एपीआई हैं:

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

हम Room के आने वाले वर्शन में, पहले से पैकेज किए गए डेटाबेस के लिए सहायता जोड़ने का इरादा रखते हैं.

एक से ज़्यादा इंस्टेंस अमान्य करना

एक से ज़्यादा इंस्टेंस को अमान्य करने की सुविधा चालू करने वाला एपीआई, RoomDatabase.Builder.enableMultiInstanceInvalidation सिर्फ़ Android पर उपलब्ध है. यह सामान्य या अन्य प्लैटफ़ॉर्म पर उपलब्ध नहीं है.