রুম ৩.০

Room পার্সিস্টেন্স লাইব্রেরিটি SQLite-এর উপর একটি অ্যাবস্ট্রাকশন লেয়ার প্রদান করে, যা SQLite-এর সম্পূর্ণ শক্তিকে কাজে লাগানোর পাশাপাশি আরও শক্তিশালী ডাটাবেস অ্যাক্সেসের সুযোগ করে দেয়।
সর্বশেষ আপডেট স্থিতিশীল রিলিজ রিলিজ প্রার্থী বিটা রিলিজ আলফা রিলিজ
০৮ এপ্রিল, ২০২৬ - - - ৩.০.০-আলফা০৩

নির্ভরতা ঘোষণা করা

Room3-এর উপর নির্ভরতা যোগ করতে হলে, আপনাকে আপনার প্রজেক্টে গুগল মেভেন রিপোজিটরি যোগ করতে হবে। আরও তথ্যের জন্য গুগলের মেভেন রিপোজিটরি পড়ুন।

আপনার অ্যাপ বা মডিউলের build.gradle ফাইলে প্রয়োজনীয় আর্টিফ্যাক্টগুলোর ডিপেন্ডেন্সি যোগ করুন:

কোটলিন

dependencies {
    val room_version = ""

    implementation("androidx.room3:room3-runtime:$room_version")
    ksp("androidx.room3:room3-compiler:$room_version")
}

গ্রুভি

dependencies {
    def room_version = ""

    implementation "androidx.room3:room3-runtime:$room_version"

    ksp "androidx.room3:room3-compiler:$room_version"
}

KSP প্লাগইন ব্যবহারের তথ্যের জন্য, KSP কুইক-স্টার্ট ডকুমেন্টেশন দেখুন।

নির্ভরতা সম্পর্কে আরও তথ্যের জন্য, 'বিল্ড নির্ভরতা যোগ করুন ' দেখুন।

রুম গ্রেডল প্লাগইন ব্যবহার করুন

আপনি Room কম্পাইলারের অপশনগুলো কনফিগার করতে Room Gradle Plugin ব্যবহার করতে পারেন। প্লাগইনটি প্রজেক্টকে এমনভাবে কনফিগার করে, যাতে জেনারেটেড স্কিমাগুলো (যা কম্পাইল টাস্কের আউটপুট এবং অটো-মাইগ্রেশনের জন্য ব্যবহৃত হয়) রিপ্রডিউসিবল ও ক্যাশেযোগ্য বিল্ডের জন্য সঠিকভাবে কনফিগার করা থাকে।

প্লাগইনটি যোগ করতে, আপনার শীর্ষ-স্তরের গ্রেডল বিল্ড ফাইলে প্লাগইন এবং এর সংস্করণটি নির্ধারণ করুন।

গ্রুভি

plugins {
    id 'androidx.room3' version "$room_version" apply false
}

কোটলিন

plugins {
    id("androidx.room3") version "$room_version" apply false
}

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

গ্রুভি

plugins {
    id 'androidx.room3'
}

room3 {
    schemaDirectory "$projectDir/schemas"
}

কোটলিন

plugins {
    id("androidx.room3")
}

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

Room Gradle Plugin ব্যবহার করার সময় একটি schemaDirectory সেট করা আবশ্যক। এটি Room কম্পাইলার এবং বিভিন্ন কম্পাইল টাস্ক ও এর ব্যাকএন্ডগুলোকে (kotlinc, KSP) ফ্লেভারড ফোল্ডারে স্কিমা ফাইল আউটপুট করার জন্য কনফিগার করবে, যেমন schemas/flavorOneDebug/com.package.MyDatabase/1.json । ভ্যালিডেশন এবং অটো-মাইগ্রেশনের জন্য এই ফাইলগুলো রিপোজিটরিতে চেক-ইন করা উচিত।

প্রতিক্রিয়া

আপনার মতামত জেটপ্যাককে আরও উন্নত করতে সাহায্য করে। আপনি যদি নতুন কোনো সমস্যা খুঁজে পান অথবা এই লাইব্রেরিটি উন্নত করার জন্য কোনো ধারণা থাকে, তবে আমাদের জানান। নতুন কোনো সমস্যা তৈরি করার আগে অনুগ্রহ করে এই লাইব্রেরির বিদ্যমান সমস্যাগুলো দেখে নিন। আপনি তারকা বোতামে ক্লিক করে কোনো বিদ্যমান সমস্যায় আপনার ভোট যোগ করতে পারেন।

একটি নতুন সমস্যা তৈরি করুন

আরও তথ্যের জন্য ইস্যু ট্র্যাকার ডকুমেন্টেশন দেখুন।

সংস্করণ ৩.০

সংস্করণ 3.0.0-alpha03

০৮ এপ্রিল, ২০২৬

androidx.room3:room3-*:3.0.0-alpha03 প্রকাশিত হয়েছে। সংস্করণ 3.0.0-alpha03-এ এই কমিটগুলো রয়েছে।

এপিআই পরিবর্তন

  • @Database ডিক্লারেশনে কনস্ট্রাক্টরটি রেফারেন্স করা হলে Lint ওয়ার্নিং এড়াতে RoomDatabase এর নো-আর্গ কনস্ট্রাক্টরটিকে পাবলিক করুন। ( I9bac2 , b/494722261 )
  • Room.inMemoryDatabaseBuilder এবং Room.databaseBuilder এর এমন একটি সংস্করণ যোগ করুন যা কোনো Android Context গ্রহণ করে না। Room 3.0-এ Context-এর প্রয়োজনীয়তা অনেকাংশে কমে গেছে এবং তাই Builder-এর জন্য এটিকে একটি ঐচ্ছিক মান হিসেবে তৈরি করায় সাধারণ কোডে ইন-মেমরি ডেটাবেস আরও সহজে তৈরি করা যায়। ( I5d502 , b/438041176 )

বাগ সংশোধন

  • onValidateSchema ফাংশনের বডি খুব বড় হওয়ার কারণে JVM এবং Android-এ তৈরি হওয়া কোডে একটি 'code too large' ত্রুটি সংশোধন করা হয়েছে ( b/493708172 )।

সংস্করণ 3.0.0-alpha02

২৫ মার্চ, ২০২৬

androidx.room3:room3-*:3.0.0-alpha02 প্রকাশিত হয়েছে। সংস্করণ 3.0.0-alpha02-এ এই কমিটগুলো রয়েছে।

নতুন বৈশিষ্ট্য

  • FTS5 সাপোর্ট: @Fts5 অ্যানোটেশনের মাধ্যমে Room-এ FTS5 সাপোর্ট যোগ করা হয়েছে। এর মধ্যে রয়েছে FTS5 টোকেনাইজারের জন্য নতুন কনস্ট্যান্ট ( TOKENIZER_ASCII এবং TOKENIZER_TRIGRAM ) এবং 'detail' FTS অপশনের জন্য একটি enum ( FULL , COLUMN , এবং NONE )। ( I90934 , b/146824830 )
  • রুম পেজিং টার্গেটসমূহ: room3-paging js , wasmJs , tvOS , এবং watchOS টার্গেটসমূহ যোগ করা হয়েছে। ( Icffd3 , b/432783733 )

এপিআই পরিবর্তন

  • মাল্টি-প্ল্যাটফর্ম clearAllTables() : clearAllTables() ফাংশনটিকে সাধারণীকরণ করা হয়েছে, যার ফলে এটি সকল প্ল্যাটফর্মে উপলব্ধ। এটিকে একটি suspend ফাংশনেও রূপান্তরিত করা হয়েছে। ( I434ae , b/322846465 )
  • ধ্বংসাত্মক মাইগ্রেশন: fallbackToDestructiveMigration API-এর dropAllTables এ একটি ডিফল্ট প্যারামিটার মান যোগ করা হয়েছে। ( Ica88b , b/438041176 )
  • পরীক্ষামূলক এপিআই পরিবর্তনসমূহ:

    1. অ্যানোটেশন-ভিত্তিক এপিআইগুলোকে পরীক্ষামূলক হিসেবে চিহ্নিত করার সুযোগ দিতে @ExperimentalRoomApi room-common এ স্থানান্তর করা হয়েছে।

    2. একটি Room ডাটাবেস ডিক্লারেশনে @ConstructedBy এর আবশ্যকতা দমন করার জন্য একটি পরীক্ষামূলক RoomWarning যোগ করা হয়েছে। এক্ষেত্রে, DatabaseConstructor তৈরি হবে না, এবং DatabaseBuilder মাধ্যমে একটি ফ্যাক্টরি ইমপ্লিমেন্টেশন প্রদান করতে হবে। ( If5443 )

বাগ সংশোধন

  • পেজিং সোর্স: PagingSourceDaoReturnTypeConverter আপডেট করা হয়েছে যাতে এটি সঠিকভাবে নির্দেশ করে যে এর convert ফাংশনটি READ কোয়েরির জন্য উদ্দিষ্ট। ( I3b067 , b/139872302 )

সংস্করণ 3.0.0-alpha01

১১ মার্চ, ২০২৬

androidx.room3:room3-*:3.0.0-alpha01 প্রকাশিত হয়েছে।

Room 3.0 ( androidx.room3 প্যাকেজ) হলো Room 2.x প্যাকেজ ( androidx.room )-এর একটি প্রধান সংস্করণ আপডেট, যা কোটলিন মাল্টিপ্ল্যাটফর্ম (KMP)-এর উপর আলোকপাত করে।

মূল উপাদানগুলোর সাথে কোর অ্যানোটেশন এপিআইগুলোও অপরিবর্তিত রাখা হয়েছে:

  • একটি অ্যাবস্ট্রাক্ট ক্লাস যা androidx.room3.RoomDatabase এক্সটেন্ড করে এবং @Database দিয়ে অ্যানোটেট করা থাকে, সেটিই হলো Room-এর অ্যানোটেশন প্রসেসরের এন্ট্রি পয়েন্ট।
  • ডাটাবেস ডিক্লারেশনে এক বা একাধিক ডেটা ক্লাস থাকে যা ডাটাবেস স্কিমা বর্ণনা করে এবং এগুলো @Entity দিয়ে অ্যানোটেট করা থাকে।
  • ডাটাবেস অপারেশনগুলো @Dao ডিক্লারেশনে সংজ্ঞায়িত করা হয়, যেগুলোতে কোয়েরি ফাংশন থাকে এবং যার SQL স্টেটমেন্টগুলো @Query অ্যানোটেশনের মাধ্যমে সংজ্ঞায়িত করা হয়।
  • রানটাইমে, RoomDatabase.Builder এর মাধ্যমে ডাটাবেস ইমপ্লিমেন্টেশনটি পাওয়া যায়, যা ডাটাবেস কনফিগার করতেও ব্যবহৃত হয়।

"Room" গাইড ব্যবহার করে স্থানীয় ডেটাবেসে ডেটা সংরক্ষণ করার বেশিরভাগ ডকুমেন্টেশন এখনও Room 3.0-এর জন্য প্রাসঙ্গিক।

Room 2.x এবং Room 2.x-এর মধ্যে প্রধান পার্থক্যগুলো নিম্নরূপ:

  • নতুন প্যাকেজ, androidx.room3
  • SupportSQLite API-গুলো আর সমর্থিত নয়, যদি না আপনি androidx.room3:room3-sqlite-wrapper ব্যবহার করেন।
  • এখন সমস্ত ডাটাবেস অপারেশন কো-রুটিন এপিআই ভিত্তিক।
  • শুধুমাত্র কোটলিন কোড জেনারেশন।
  • কোটলিন সিম্বল প্রসেসিং (কেএসপি) আবশ্যক।

ব্রেকিং পরিবর্তনের পাশাপাশি, Room 3.0-তে 2.x-এর তুলনায় নতুন কার্যকারিতা যুক্ত করা হয়েছে:

  • JS এবং WasmJS সমর্থন
  • কাস্টম ডিএও রিটার্ন টাইপ

নতুন প্যাকেজ

বিদ্যমান Room 2.x ইমপ্লিমেন্টেশনগুলোর সাথে সামঞ্জস্যের সমস্যা এড়াতে এবং Room-এর উপর ট্রানজিটিভ ডিপেন্ডেন্সি আছে এমন লাইব্রেরিগুলোর (যেমন, WorkManager) জন্য, Room 3.0 একটি নতুন প্যাকেজে রাখা হয়েছে। এর ফলে এটির একটি নতুন মেভেন গ্রুপ এবং আর্টিফ্যাক্ট আইডি-ও যুক্ত হয়েছে। উদাহরণস্বরূপ, androidx.room:room-runtime পরিবর্তে এখন হয়েছে androidx.room3:room3-runtime এবং androidx.room.RoomDatabase এর মতো ক্লাসগুলো এখন androidx.room3.RoomDatabase এ অবস্থিত হবে।

কোন SupportSQLite API নেই

Room 3.0 সম্পূর্ণরূপে SQLiteDriver API দ্বারা সমর্থিত এবং এটি এখন আর SupportSQLiteDatabase মতো SupportSQLite টাইপ বা Cursor মতো Android টাইপগুলোকে রেফারেন্স করে না। Room 3.0 এবং 2.x-এর মধ্যে এটিই সবচেয়ে উল্লেখযোগ্য পরিবর্তন, কারণ SupportSQLiteDatabase প্রতিরূপ RoomDatabase API-গুলো এবং SupportSQLiteOpenHelper পাওয়ার API-টি সরিয়ে ফেলা হয়েছে। এখন একটি RoomDatabase বিল্ড করার জন্য একটি SQLiteDriver প্রয়োজন

উদাহরণস্বরূপ, সরাসরি ডাটাবেস অপারেশনের জন্য ব্যবহৃত এপিআইগুলোকে ড্রাইভারের সমতুল্য ফাংশন দ্বারা প্রতিস্থাপন করা হয়:

// Room 2.x
roomDatabase.runInTransaction { ... }

// Room 3.x
roomDatabase.withWriteTransaction { ... }
// Room 2.x
roomDatabase.query("SELECT * FROM Song").use { cursor -> ... }

// Room 3.x
roomDatabase.useReaderConnection { connection ->
  connection.usePrepared("SELECT * FROM Song") { stmt -> ... }
}

যেসব কলব্যাক এপিআই-এর আর্গুমেন্ট হিসেবে SupportSQLiteDatabase ছিল, সেগুলোকেও তাদের সমতুল্য এপিআই দ্বারা প্রতিস্থাপন করা হয়েছে, যেগুলোর আর্গুমেন্ট হিসেবে SQLiteConnection রয়েছে। এগুলোর মধ্যে রয়েছে মাইগ্রেশন কলব্যাক ফাংশন, যেমন Migration.onMigrate() এবং AutoMigrationSpec.onPostMigrate() সেইসাথে ডাটাবেস কলব্যাক, যেমন RoomDatabase.Callback.onCreate() , RoomDatabase.Callback.onOpen() , ইত্যাদি।

যদি কোনো KMP প্রোজেক্টে Room ব্যবহার করা হয়ে থাকে, তাহলে 3.0-এ মাইগ্রেট করা সহজতর, কারণ এতে মূলত ইম্পোর্ট রেফারেন্স আপডেট করার প্রয়োজন হয়। অন্যথায়, শুধুমাত্র অ্যান্ড্রয়েডের জন্য ব্যবহৃত Room থেকে KMP-তে মাইগ্রেশনের একই কৌশল প্রযোজ্য, Room KMP মাইগ্রেশন গাইডটি দেখুন।

SupportSQLite র‍্যাপার

Room 3.x, মাইগ্রেশন সহজ করার জন্য 2.x-এ তৈরি SupportSQLite র‍্যাপারটি সংরক্ষণ করে এবং এটি এখন androidx.room3:room3-sqlite-wrapper একটি নতুন আর্টিফ্যাক্টে অবস্থিত। কম্প্যাটিবিলিটি এপিআই আপনাকে একটি RoomDatabase SupportSQLiteDatabase এ রূপান্তর করার সুযোগ দেয়। roomDatabase.openHelper.writableDatabase এর ব্যবহার roomDatabase.getSupportWrapper() দ্বারা প্রতিস্থাপন করা যেতে পারে।

কোটলিন এবং কোরাউটিন প্রথমে

লাইব্রেরিটিকে আরও উন্নত করার জন্য, Room 3.0 শুধুমাত্র কোটলিন কোড তৈরি করে এবং এটি কেবল একটি কোটলিন সিম্বল প্রসেসর (KSP)। Room 2.x-এর তুলনায়, Room 3.0-এ কোনো জাভা কোড জেনারেশন নেই এবং KAPT বা JavaAP-এর মাধ্যমে অ্যানোটেশন প্রসেসর কনফিগার করা আর সম্ভব নয়। উল্লেখ্য যে, KSP জাভা সোর্স প্রসেস করতে সক্ষম এবং Room কম্পাইলার ডাটাবেস, এনটিটি বা DAO-এর জন্য কোড তৈরি করবে, যেগুলোর সোর্স ডিক্লারেশন জাভাতে লেখা। একটি মাল্টি-মডিউল প্রজেক্ট তৈরি করার পরামর্শ দেওয়া হয়, যেখানে Room-এর ব্যবহার কেন্দ্রীভূত থাকবে এবং কোটলিন গ্রেডল প্লাগইন ও KSP কোডবেসের বাকি অংশকে প্রভাবিত না করেই প্রয়োগ করা যাবে।

Room 3.0-এর জন্য Coroutines-এর ব্যবহারও আবশ্যক, এবং আরও নির্দিষ্টভাবে বললে, DAO ফাংশনগুলোকে সাসপেন্ডিং হতে হবে, যদি না সেগুলো কোনো রিঅ্যাক্টিভ টাইপ, যেমন একটি Flow বা একটি কাস্টম DAO রিটার্ন টাইপ, রিটার্ন করে। ডাটাবেস অপারেশন সম্পাদনের জন্য ব্যবহৃত Room API-গুলোও সাসপেন্ড ফাংশন, যেমন RoomDatabase.useReaderConnection এবং RoomDatabase.useWriterConnection

Room 2.x-এর বিপরীতে, এখন আর Executor দিয়ে একটি RoomDatabase কনফিগার করা সম্ভব নয়, এর পরিবর্তে ডেটাবেসের বিল্ডারের মাধ্যমে একটি ডিসপ্যাচারসহ CoroutineContext প্রদান করা যেতে পারে।

রুম ৩.০-তে InvalidationTracker এপিআইগুলো Flow -ভিত্তিক। InvalidationTracker.Observer এবং এর সাথে সম্পর্কিত এপিআই addObserverremoveObserver সরিয়ে ফেলা হয়েছে। ডাটাবেস অপারেশনে সাড়া দেওয়ার পদ্ধতিটি হলো কো-রুটিন ফ্লো, যা InvalidationTracker মধ্যে createFlow() এপিআই ব্যবহার করে তৈরি করা যায়।

ব্যবহারের উদাহরণ:

fun getArtistTours(from: Date, to: Date): Flow<Map<Artist, TourState>> {
    return db.invalidationTracker.createFlow("Artist").map { _ ->
        val artists = artistsDao.getAllArtists()
        val tours = tourService.fetchStates(artists.map { it.id })
        associateTours(artists, tours, from, to)
    }
}

ওয়েব সাপোর্ট

Room 3.0 রিলিজে KMP টার্গেট হিসেবে JavaScript এবং WasmJs যুক্ত করা হয়েছে। এর সাথে JavaScript এবং WasmJs-কে টার্গেট করে এমন SQLiteDriver ইন্টারফেস ( androidx.sqlite:sqlite ) এবং নতুন আর্টিফ্যাক্ট androidx.sqlite:sqlite-web এ অবস্থিত WebWorkerSQLiteDriver নামক একটি নতুন ড্রাইভারের রিলিজের ফলে, এখন সকল প্রধান KMP প্ল্যাটফর্মকে টার্গেট করে এমন সাধারণ কোডে Room ব্যবহার করা সম্ভব।

ওয়েব প্ল্যাটফর্মগুলোর অ্যাসিঙ্ক্রোনাস প্রকৃতির কারণে, Room API-গুলো যেগুলো আর্গুমেন্ট হিসেবে SQLiteStatement নিত, সেগুলো এখন সাসপেন্ড ফাংশন। এই ফাংশনগুলোর উদাহরণ হলো Migration.onMigrate() , RoomDatabase.Callback.onCreate() , PooledConnection.usePrepared() এবং অন্যান্য। ড্রাইভার API-গুলোর মধ্যে অ্যাসিঙ্ক্রোনাস API-গুলো সব প্ল্যাটফর্মে সাধারণ এবং সিঙ্ক্রোনাস API-গুলো নন-ওয়েব টার্গেটের জন্য সাধারণ। সুতরাং, যে প্রজেক্ট ওয়েবকে টার্গেট করে না, সেটি সাধারণ কোডে সিঙ্ক্রোনাস API-গুলো ( SQLiteDriver.open() , SQLiteConnection.prepare() এবং SQLiteStatement.step() ) ব্যবহার করা চালিয়ে যেতে পারে। অন্যদিকে, যে প্রজেক্ট শুধুমাত্র ওয়েবকে টার্গেট করে, তাকে অবশ্যই অ্যাসিঙ্ক্রোনাস API-গুলো ( SQLiteDriver.openAsync() , SQLiteConnection.prepareAsync() এবং SQLiteStatement.stepAsync() ) ব্যবহার করতে হবে।

সুবিধার জন্য androidx.sqlite প্যাকেজটি উল্লিখিত API-গুলোর সিনক্রোনাস নামসহ সাসপেন্ড এক্সটেনশন ফাংশনও যুক্ত করেছে (এর সাথে SQLiteConnection.executeSQL যোগ করা হয়েছে)। যখন প্রজেক্টটি ওয়েব এবং নন-ওয়েব উভয় প্ল্যাটফর্মকে টার্গেট করে, তখন এই API-গুলো ব্যবহার করার পরামর্শ দেওয়া হয়, কারণ এগুলো হলো এক্সপেক্ট/অ্যাকচুয়াল ডিক্লারেশন যা প্ল্যাটফর্ম অনুযায়ী সঠিক ভ্যারিয়েন্টকে কল করবে। Room-এর রানটাইম এই API-গুলোই ব্যবহার করে এবং সমস্ত সমর্থিত প্ল্যাটফর্মের জন্য কমন কোডে ড্রাইভার ব্যবহার সক্ষম করে।

ব্যবহারের উদাহরণ:

import androidx.sqlite.executeSQL
import androidx.sqlite.step

roomDatabase.useWriterConnection { connection ->
    val deletedSongs = connection.usePrepared(
        "SELECT count(*) FROM Song"
    ) { stmt ->
        stmt.step()
        stmt.getLong(0)
    }
    connection.executeSQL("DELETE FROM Song")
    deletedSongs
}

WebWorkerSQLiteDriver হলো SQLiteDriver এর একটি বাস্তবায়ন, যা মূল থ্রেডের বাইরে ডাটাবেস অপারেশন সম্পাদনের জন্য একটি Web Worker-এর সাথে যোগাযোগ করে এবং Origin Private File System (OPFS)-এ ডাটাবেস সংরক্ষণে সক্ষম করে। ড্রাইভারটি ইনস্ট্যানশিয়েট করার জন্য এমন একটি ওয়ার্কার প্রয়োজন যা একটি সরল যোগাযোগ প্রোটোকল বাস্তবায়ন করে; এই প্রোটোকলটি WebWorkerSQLiteDriver KDoc- এ বর্ণনা করা হয়েছে।

বর্তমানে WebWorkerSQLiteDriver সাথে কমিউনিকেশন প্রোটোকল বাস্তবায়নকারী কোনো ডিফল্ট ওয়ার্কার আসে না, কিন্তু উদাহরণস্বরূপ, androidx কোডবেসে একটি ওয়ার্কার ইমপ্লিমেন্টেশন রয়েছে যা আপনার প্রোজেক্টে ব্যবহার করা যেতে পারে। এটি SQLite-এর WASM ব্যবহার করে এবং OPFS-এ ডাটাবেস সংরক্ষণ করে। উদাহরণ ওয়ার্কারটি একটি লোকাল NPM প্যাকেজ হিসেবে প্রকাশিত হয়েছে এবং Kotlin-এর NPM ডিপেন্ডেন্সি সমর্থনের কারণে, ওয়ার্কারটি সার্ভ করার জন্য একটি ছোট KMP মডিউল তৈরি করা যেতে পারে।

Room-এর জন্য লোকাল ওয়েব ওয়ার্কারের ব্যবহার প্রদর্শনকারী নিম্নলিখিত গিটহাব প্রজেক্টটি দেখুন।

প্রকল্পে একবার কোনো কর্মীকে সেট আপ করা হয়ে গেলে, Room for the Web কনফিগার করার পদ্ধতি অন্যান্য প্ল্যাটফর্মের মতোই:

fun createDatabase(): MusicDatabase {
    return Room.databaseBuilder<MusicDatabase>("music.db")
        .setDriver(WebWorkerSQLiteDriver(createWorker()))
        .build()
}

fun createWorker() =
    Worker(js("""new URL("sqlite-web-worker/worker.js", import.meta.url)"""))

ওয়েব ড্রাইভারের ভবিষ্যৎ কোনো সংস্করণে NPM-এ প্রকাশিত একটি ডিফল্ট ওয়ার্কার অন্তর্ভুক্ত থাকতে পারে, যা ওয়েব সেটআপকে আরও সহজ করে তুলবে।

কাস্টম ডিএও রিটার্ন টাইপ

Room 3.0-তে RxJava এবং Paging-এর মতো বিভিন্ন DAO রিটার্ন টাইপ ইন্টিগ্রেশনকে DAO রিটার্ন টাইপ কনভার্টার নামক একটি নতুন API ব্যবহার করার জন্য রূপান্তরিত করা হয়েছে। একটি DAO রিটার্ন টাইপ কনভার্টার ফাংশন ( @DaoReturnTypeConverter ) একটি DAO ফাংশনের ফলাফলকে অ্যানোটেড ফাংশন দ্বারা সংজ্ঞায়িত একটি কাস্টম টাইপে রূপান্তর করতে সক্ষম করে। এই ফাংশনগুলো Room-এর জেনারেটেড কোডে অংশগ্রহণ করতে সাহায্য করে, যা কোয়েরির ফলাফলকে ডেটা অবজেক্টে রূপান্তর করে। যে ক্লাসগুলোতে DAO রিটার্ন টাইপ কনভার্টার থাকে, সেগুলোকে @Database বা @Dao ডিক্লারেশনে @DaoReturnTypeConverters অ্যানোটেশনের মাধ্যমে রেজিস্টার করতে হয়।

উদাহরণস্বরূপ, একটি DAO কোয়েরি থেকে PagingSource রিটার্ন করানোর জন্য, androidx.room3:room3-paging এ অবস্থিত কনভার্টার ক্লাসটিকে এখন অবশ্যই রেজিস্টার করতে হবে:

@Dao
@DaoReturnTypeConverters(PagingSourceDaoReturnTypeConverter::class)
interface MusicDao {
    @Query("SELECT * FROM Song)
    fun getSongsPaginated(): PagingSource<Int, Song>
}

বিদ্যমান ইন্টিগ্রেশনগুলোকে DAO রিটার্ন টাইপ কনভার্টারে স্থানান্তর করা হয়েছে:

রিটার্ন টাইপ রূপান্তরকারী শ্রেণী প্রত্নবস্তু
পেজিংসোর্স PageingSourceDaoReturnTypeConverter androidx.room3:room3-পেজিং
পর্যবেক্ষণযোগ্য, প্রবাহযোগ্য, সম্পূর্ণযোগ্য, একক, সম্ভবত RxDaoReturnTypeConverters androidx.room3:room3-rxjava3
লিসেনেবলফিউচার GuavaDaoReturnTypeConverter androidx.room3:room3-guava
লাইভডেটা LiveDataDaoReturnTypeConverter androidx.room3:room3-লাইভডেটা

কলাম টাইপ কনভার্টারের মতোই, DAO রিটার্ন টাইপ কনভার্টারও অ্যাপ্লিকেশন দ্বারা সংজ্ঞায়িত করা যেতে পারে। উদাহরণস্বরূপ, একটি অ্যাপ্লিকেশন kotlin.js.Promise ওয়েব টাইপের জন্য একটি @DaoReturnTypeConverter ঘোষণা করতে পারে।

object PromiseDaoReturnTypeConverter {
    @DaoReturnTypeConverter([OperationType.READ, OperationType.WRITE])
    fun <T> convert(
        db: RoomDatabase,
        executeAndConvert: suspend () -> T
    ): Promise<T> {
        return db.getCoroutineScope().promise { executeAndConvert() }
    }
}

উপরোক্ত কনভার্টারটি তখন DAO কোয়েরি ফাংশনগুলোকে Promise রিটার্ন করার সুযোগ দেয়:

@Dao
@DaoReturnTypeConverters(PromiseDaoReturnTypeConverter::class)
interface MusicDao {
    @Query("SELECT * FROM Song")
    fun getAllSongs(): Promise<List<Song>>
}

একটি @DaoReturnTypeConverter ফাংশনের প্যারামিটারের সংখ্যা এবং প্রকারের ক্ষেত্রে কিছু আবশ্যিক শর্ত রয়েছে। সম্ভাব্য প্যারামিটারগুলো হলো:

  • db: RoomDatabase : (ঐচ্ছিক) RoomDatabase ইনস্ট্যান্সে অ্যাক্সেস প্রদান করে, যা অতিরিক্ত ডাটাবেস অপারেশন সম্পাদন করতে বা কো-রুটিন স্কোপ অ্যাক্সেস করার জন্য উপযোগী হতে পারে।
  • tableNames: Array<String> : (ঐচ্ছিক) কোয়েরি দ্বারা অ্যাক্সেস করা টেবিলগুলো ধারণ করে, যা Room-এর InvalidationTracker.createFlow() API-এর সাথে মিলিত হয়ে অবজার্ভেবল / রিঅ্যাক্টিভ টাইপ সমর্থন করার জন্য উপযোগী।
  • rawQuery: RoomRawQuery : (ঐচ্ছিক) রানটাইমে কোয়েরিটির একটি ইনস্ট্যান্স ধারণ করে, যা PagingSourceDaoReturnTypeConverter দ্বারা বাস্তবায়িত LIMIT / OFFSET কৌশলের মতো রূপান্তরগুলি সক্ষম করে।
  • executeAndConvert: suspend () -> T : (আবশ্যক) এটি Room দ্বারা জেনারেট করা ফাংশন যা কোয়েরিটি এক্সিকিউট করবে এবং এর ফলাফলকে ডেটা অবজেক্টে পার্স করবে।

DAO রিটার্ন টাইপ কনভার্টার তৈরির প্রয়োজনীয়তা সম্পর্কে আরও তথ্যের জন্য, @DaoReturnTypeConverter API-এর KDoc দেখুন।