Room 3.0

  
توفر مكتبة Room لاستدامة البيانات طبقة تجريد فوق SQLite للسماح بالوصول إلى قاعدة البيانات بشكل أكثر فعالية مع الاستفادة من إمكانات SQLite الكاملة.
آخر الأخبار الإصدار الثابت إصدار محتمل الإصدار التجريبي الإصدار الأولي
‫19 مايو 2026 - - - 3.0.0-alpha05

تحديد الاعتماديات

لإضافة اعتمادية على Room3، يجب تضمين مستودع Google Maven في مشروعك. اطّلِع على مستودع Maven من Google لمزيد من المعلومات.

أضِف الاعتماديات الخاصة بالعناصر التي تحتاج إليها في ملف build.gradle لتطبيقك أو وحدتك:

Kotlin

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 Gradle Plugin

يمكنك استخدام Room Gradle Plugin لضبط خيارات برنامج Room البرمجي. تضبط الإضافة المشروع بحيث يتم ضبط المخططات التي تم إنشاؤها (وهي ناتج مهام التجميع ويتم استخدامها في عمليات النقل التلقائي) بشكل صحيح لإنشاء إصدارات قابلة للتكرار والتخزين المؤقت.

لإضافة المكوّن الإضافي، حدِّد المكوّن الإضافي وإصداره في ملف تصميم Gradle ذي المستوى الأعلى.

أنيق

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

Kotlin

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

في ملف تصميم Gradle على مستوى الوحدة، طبِّق المكوّن الإضافي واستخدِم إضافة room3.

أنيق

plugins {
    id 'androidx.room3'
}

room3 {
    schemaDirectory "$projectDir/schemas"
}

Kotlin

plugins {
    id("androidx.room3")
}

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

يجب ضبط schemaDirectory عند استخدام مكوّن Room الإضافي في Gradle. سيؤدي ذلك إلى ضبط برنامج Room المجمّع ومهام التجميع المختلفة وبرامج الخلفية (kotlinc وKSP) لإخراج ملفات المخطط إلى مجلدات ذات إصدارات مختلفة، مثل schemas/flavorOneDebug/com.package.MyDatabase/1.json. يجب إيداع هذه الملفات في المستودع لاستخدامها في عمليات التحقّق وعمليات النقل التلقائي.

الملاحظات

تساعدنا ملاحظاتك في تحسين Jetpack. يُرجى إعلامنا إذا اكتشفت مشاكل جديدة أو كانت لديك أفكار لتحسين هذه المكتبة. يُرجى الاطّلاع على المشاكل الحالية في هذه المكتبة قبل إنشاء مشكلة جديدة. يمكنك إضافة صوتك إلى مشكلة حالية من خلال النقر على زر النجمة.

إنشاء مشكلة جديدة

يُرجى الاطّلاع على مستندات Issue Tracker للحصول على مزيد من المعلومات.

الإصدار ‎‏‎3.0

الإصدار ‎3.0.0-alpha05

‫19 مايو 2026

تم طرح androidx.room3:room3-*:3.0.0-alpha05. يتضمّن الإصدار 3.0.0-alpha05 هذه التعديلات.

تغييرات واجهة برمجة التطبيقات

  • يتم تعديل @Relation و@Junction بحيث تكون السمتان parentColumns وentityColumns عبارة عن مصفوفة من أسماء الأعمدة التي سيتم استخدامها كمفاتيح لحل العلاقات، ما يتيح بدوره استخدام مفاتيح العلاقات المركّبة. (I92196، b/64247765)

الإصدار ‎3.0.0-alpha04

‫6 مايو 2026

تم طرح androidx.room3:room3-*:3.0.0-alpha04. يتضمّن الإصدار 3.0.0-alpha04 هذه التعديلات.

تغييرات واجهة برمجة التطبيقات

  • أضِف واجهات برمجة التطبيقات لضبط مجموعة الاتصالات في Room. يمكن استخدام دالتَي الإنشاء setSingleConnectionPool() وsetMultipleConnectionPool() للتحكّم في الحدّ الأقصى لعدد الاتصالات التي سيفتحها Room بقاعدة البيانات. (I9700d، b/438041176، b/432820350)
  • إزالة DatabaseConfiguration Room من واجهة برمجة التطبيقات العامة لأنّ ما مِن واجهة برمجة تطبيقات عامة أخرى تشير إلى الإعداد. (I5f1e9، b/438041176)

إصلاح الأخطاء

  • حصر استهداف الويب لاستخدام مجموعة اتصال واحدة لتجنُّب مشاكل "قاعدة البيانات مقفلة" التي تنشأ مع نظام OPFS (b/496255935)
  • محاولة إصلاح (مرة أخرى) الخطأ "الطريقة كبيرة جدًا" الذي يحدث بسبب إنشاء Room لملف onValidateSchema كبير جدًا. يتم تقسيم الدالة استنادًا إلى عدد الكشوف، ولكن القياس ليس دقيقًا. إذا استمر ظهور هذا الخطأ، يمكنك تعديل عدد الجمل التي سيحتسبها Room في عملية التقسيم من خلال خيار معالج التعليقات التوضيحية room.validationSplitSize. تم حاليًا ضبط القيمة التلقائية على 300 عبارة، لذا استخدِم عددًا أقل إذا كانت المشكلة لا تزال قائمة (b/493708172).

الإصدار 3.0.0-alpha03

‫8 أبريل 2026

تم طرح androidx.room3:room3-*:3.0.0-alpha03. يتضمّن الإصدار 3.0.0-alpha03 هذه التعديلات.

تغييرات واجهة برمجة التطبيقات

  • اجعل الدالة الإنشائية التي لا تتضمّن وسيطات في RoomDatabase عامة لتجنُّب ظهور تحذير من Lint عند الإشارة إلى الدالة الإنشائية في تعريف ‎ @Database. (I9bac2، b/494722261)
  • أضِف إصدارًا من Room.inMemoryDatabaseBuilder وRoom.databaseBuilder لا يستقبلان Android Context. تم تقليل الحاجة إلى Context بشكل كبير في Room 3.0، وبالتالي فإنّ جعلها قيمة اختيارية في Builder يتيح إنشاء قواعد بيانات في الذاكرة في الرمز البرمجي الشائع بسهولة أكبر. (I5d502، b/438041176)

إصلاح الأخطاء

  • تم إصلاح الخطأ "الرمز كبير جدًا" في الرمز الذي تم إنشاؤه على JVM وAndroid عندما كان نص الدالة onValidateSchema كبيرًا جدًا (b/493708172).

الإصدار ‎3.0.0-alpha02

‫25 مارس 2026

تم طرح androidx.room3:room3-*:3.0.0-alpha02. يتضمّن الإصدار 3.0.0-alpha02 هذه التعديلات.

الميزات الجديدة

  • إتاحة FTS5: تمت إضافة إمكانية استخدام FTS5 في Room من خلال التعليق التوضيحي @Fts5. يشمل ذلك ثوابت جديدة لمحلّلات الرموز المميزة FTS5 (TOKENIZER_ASCII وTOKENIZER_TRIGRAM) وقيمة تعدادية لخيار FTS "التفاصيل" (FULL وCOLUMN وNONE). (I90934 وb/146824830)
  • استهداف صفحات الغرف: تمت إضافة الاستهدافات js وwasmJs وtvOS وwatchOS إلى room3-paging. (Icffd3، b/432783733)

تغييرات واجهة برمجة التطبيقات

  • متعدد المنصات clearAllTables(): تم توحيد clearAllTables()، ما يجعله متاحًا على جميع المنصات. تم أيضًا تحويلها إلى دالة suspend. (I434ae، b/322846465)
  • عملية نقل البيانات مع فقدانها: أضفنا قيمة مَعلمة تلقائية إلى dropAllTables في واجهات برمجة التطبيقات fallbackToDestructiveMigration. (Ica88b، b/438041176)
  • التغييرات في واجهة برمجة التطبيقات التجريبية:

    1. تم نقل @ExperimentalRoomApi إلى room-common للسماح بتصنيف واجهات برمجة التطبيقات المستندة إلى التعليقات التوضيحية على أنّها تجريبية.

    2. تمت إضافة RoomWarning تجريبية لإلغاء شرط توفّر @ConstructedBy في تعريف قاعدة بيانات Room. في هذه الحالة، لن يتم إنشاء DatabaseConstructor، ويجب توفير عملية تنفيذ المصنع من خلال DatabaseBuilder. (If5443)

إصلاح الأخطاء

  • مصدر التقسيم إلى صفحات: تم تعديل PagingSourceDaoReturnTypeConverter للإشارة بشكلٍ صحيح إلى أنّ وظيفة التحويل مخصّصة لاستعلامات القراءة. (I3b067، b/139872302)

الإصدار 3.0.0-alpha01

‫11 مارس 2026

تم طرح androidx.room3:room3-*:3.0.0-alpha01.

‫Room 3.0 (الحزمة androidx.room3) هو تحديث رئيسي لإصدار حزمة Room 2.x (androidx.room) يركّز على Kotlin Multiplatform (KMP).

تم الإبقاء على واجهات برمجة التطبيقات الأساسية الخاصة بالتعليقات التوضيحية كما هي، بالإضافة إلى المكوّنات الرئيسية:

  • الفئة المجردة التي توسّع androidx.room3.RoomDatabase ويتم إضافة تعليقات توضيحية إليها باستخدام @Database هي نقطة الدخول إلى معالج التعليقات التوضيحية في Room.
  • يحتوي تعريف قاعدة البيانات على فئة بيانات واحدة أو أكثر تصف مخطط قاعدة البيانات، ويتم إضافة التعليق التوضيحي @Entity إليها.
  • يتم تحديد عمليات قاعدة البيانات في تصريحات @Dao التي تحتوي على دوال استعلام يتم تحديد عبارات SQL الخاصة بها من خلال التعليق التوضيحي @Query.
  • أثناء وقت التشغيل، يمكن الحصول على تنفيذ قاعدة البيانات من خلال RoomDatabase.Builder الذي يُستخدم أيضًا لضبط قاعدة البيانات.

لا يزال معظم المحتوى في دليل حفظ البيانات في قاعدة بيانات محلية باستخدام Room مناسبًا لإصدار Room 3.0.

في ما يلي الاختلافات الرئيسية التي تتسبّب في حدوث أعطال بين Room 2.x:

  • حزمة جديدة، androidx.room3
  • لم تعُد واجهات برمجة التطبيقات SupportSQLite متوافقة، إلا إذا كنت تستخدم androidx.room3:room3-sqlite-wrapper.
  • تستند جميع عمليات قاعدة البيانات الآن إلى واجهات برمجة تطبيقات Coroutine.
  • إنشاء رموز Kotlin البرمجية فقط
  • يجب استخدام أداة Kotlin Symbol Processing (KSP).

بالإضافة إلى التغييرات غير المتوافقة، يوفّر الإصدار 3.0 من Room وظائف جديدة مقارنةً بالإصدار 2.x:

  • التوافق مع JavaScript وWasmJS
  • أنواع العائدات المخصّصة من DAO

حزمة جديدة

لتجنُّب مشاكل التوافق مع عمليات التنفيذ الحالية للإصدار 2.x من Room ومع المكتبات التي تتضمّن تبعيات متعدّية إلى Room (مثل WorkManager)، يتوفّر الإصدار 3.0 من Room في حزمة جديدة، ما يعني أنّه يتضمّن أيضًا مجموعة Maven ومعرّفات عناصر جديدة. على سبيل المثال، أصبح androidx.room:room-runtime androidx.room3:room3-runtime، وسيتم الآن نقل الصفوف مثل androidx.room.RoomDatabase إلى androidx.room3.RoomDatabase.

عدم توفّر واجهات برمجة تطبيقات SupportSQLite

يتم دعم الإصدار 3.0 من Room بالكامل من خلال واجهات برمجة التطبيقات SQLiteDriver، ولم يعُد يشير إلى أنواع SupportSQLite مثل SupportSQLiteDatabase أو أنواع Android مثل Cursor. هذا هو التغيير الأهم بين الإصدارين 3.0 و2.x من Room، وذلك بعد إزالة واجهات برمجة التطبيقات RoomDatabase التي كانت تحاكي SupportSQLiteDatabase، بالإضافة إلى واجهة برمجة التطبيقات التي كانت تستخدم للحصول على SupportSQLiteOpenHelper. أصبح SQLiteDriver مطلوبًا الآن لإنشاء RoomDatabase.

على سبيل المثال، يتم استبدال واجهات برمجة التطبيقات الخاصة بعمليات قواعد البيانات المباشرة بمكافئاتها في برنامج التشغيل:

// 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() وما إلى ذلك.

إذا كان يتم استخدام Room في مشروع KMP، سيكون نقل البيانات إلى الإصدار 3.0 أسهل لأنّه يتضمّن في الغالب تعديل مراجع الاستيراد، وإلا سيتم تطبيق استراتيجية نقل البيانات نفسها من Room في Android فقط إلى KMP، راجِع دليل نقل البيانات إلى Room KMP.

SupportSQLite Wrapper

يحتفظ الإصدار 3.x من Room بغلاف SupportSQLite الذي تم إنشاؤه في الإصدار 2.x لتسهيل عمليات نقل البيانات ويتم الآن تخزينه في العنصر الجديد androidx.room3:room3-sqlite-wrapper. تتيح لك واجهة برمجة التطبيقات المتوافقة تحويل RoomDatabase إلى SupportSQLiteDatabase. يمكن استبدال استدعاءات roomDatabase.openHelper.writableDatabase باستدعاءات roomDatabase.getSupportWrapper().

التركيز على Kotlin وCoroutines أولاً

ولتحسين المكتبة، لا ينشئ الإصدار 3.0 من Room سوى رموز Kotlin البرمجية، وهو عبارة عن أداة Kotlin Symbol Processor (KSP) فقط. مقارنةً بالإصدار 2.x من Room، لا يتم إنشاء أي رمز Java، كما لم يعُد من الممكن ضبط إعدادات معالج التعليقات التوضيحية من خلال KAPT أو JavaAP في الإصدار 3.0 من Room. يُرجى العِلم أنّ KSP يمكنه معالجة مصادر Java، وأنّ برنامج Room المترجِم سينشئ رمزًا برمجيًا لقاعدة البيانات أو الكيانات أو عناصر الوصول إلى البيانات (DAO) التي تكون بيانات المصدر الخاصة بها بتنسيق Java. ننصحك بإنشاء مشروع يتضمّن عدّة وحدات يتم فيه تركيز استخدام Room، ويمكن تطبيق إضافة Kotlin Gradle وKSP بدون التأثير في بقية قاعدة الرموز البرمجية.

يتطلّب الإصدار 3.0 من Room أيضًا استخدام الروتينات الفرعية، وبشكل أكثر تحديدًا، يجب أن تكون دوال DAO قابلة للتعليق ما لم تعرض نوع القيمة التي تم إرجاعها تفاعليًا، مثل Flow أو نوع القيمة التي تم إرجاعها مخصّص لـ DAO. تكون واجهات برمجة التطبيقات الخاصة بمكتبة Room التي تنفّذ عمليات قاعدة البيانات أيضًا دوال معلّقة، مثل RoomDatabase.useReaderConnection وRoomDatabase.useWriterConnection.

على عكس الإصدار 2.x من Room، لم يعُد من الممكن ضبط RoomDatabase باستخدام Executor، بل يمكن توفير CoroutineContext مع أداة إرسال من خلال أداة إنشاء قاعدة البيانات.

تستند واجهات برمجة التطبيقات في Room 3.0 إلى Flow، وتمت إزالة InvalidationTracker.Observer مع واجهات برمجة التطبيقات ذات الصلة addObserver وremoveObserver.InvalidationTracker تتم آلية الاستجابة لعملية قاعدة البيانات من خلال Coroutine Flows التي يمكن إنشاؤها عبر واجهة برمجة التطبيقات createFlow() في InvalidationTracker.

مثال على الاستخدام:

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 JavaScript وWasmJs كاستهدافات في KMP. بالإضافة إلى إصدار واجهات SQLiteDriver (androidx.sqlite:sqlite) التي تستهدف أيضًا JavaScript وWasmJs وبرنامج تشغيل جديد WebWorkerSQLiteDriver مضمّن في العنصر الجديد androidx.sqlite:sqlite-web، أصبح من الممكن استخدام Room في الرموز البرمجية الشائعة التي تستهدف جميع منصات KMP الرئيسية.

بسبب الطبيعة غير المتزامنة للمنصات على الويب، أصبحت واجهات برمجة تطبيقات Room التي كانت تأخذ SQLiteStatement كمعلَمة دوال تعليق. تشمل الأمثلة على هذه الوظائف Migration.onMigrate() وRoomDatabase.Callback.onCreate() وPooledConnection.usePrepared() وغيرها. في واجهات برمجة التطبيقات الخاصة ببرامج التشغيل، تكون واجهات برمجة التطبيقات غير المتزامنة شائعة على جميع المنصات، بينما تكون واجهات برمجة التطبيقات المتزامنة شائعة مع الاستهدافات غير المستندة إلى الويب. لذلك، يمكن لمشروع لا يستهدف الويب مواصلة استخدام واجهات برمجة التطبيقات المتزامنة (SQLiteDriver.open() وSQLiteConnection.prepare() وSQLiteStatement.step()) في الرمز البرمجي المشترك. في الوقت نفسه، يجب أن يستخدم المشروع الذي يستهدف الويب فقط واجهات برمجة التطبيقات غير المتزامنة (SQLiteDriver.openAsync() وSQLiteConnection.prepareAsync() وSQLiteStatement.stepAsync()).

لتسهيل الأمر، أضافت حزمة androidx.sqlite أيضًا دوال تعليق مع أسماء متزامنة لواجهات برمجة التطبيقات المذكورة (مع إضافة SQLiteConnection.executeSQL)، ويُنصح باستخدام واجهات برمجة التطبيقات هذه عندما يستهدف المشروع كلاً من المنصات على الويب وغير الويب، لأنّ واجهات برمجة التطبيقات هي تصريحات متوقّعة / فعلية ستطلب النوع المناسب استنادًا إلى المنصات. هذه هي واجهات برمجة التطبيقات التي يستخدمها وقت التشغيل في Room وتتيح استخدام برنامج التشغيل في الرمز البرمجي الشائع لجميع الأنظمة الأساسية المتوافقة.

مثال على الاستخدام:

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 لتنفيذ عملية قاعدة البيانات خارج سلسلة التعليمات الرئيسية، وتتيح تخزين قاعدة البيانات في نظام ملفات خاص بالمصدر (OPFS). لإنشاء مثيل لبرنامج التشغيل، يجب توفير منفِّذ ينفّذ بروتوكول تواصل بسيط، ويتم وصف البروتوكول في WebWorkerSQLiteDriver KDoc.

في الوقت الحالي، لا يتم شحن WebWorkerSQLiteDriver مع منفِّذ تلقائي ينفّذ بروتوكول الاتصال، ولكن على سبيل المثال، يحتوي رمز قاعدة بيانات AndroidX على تنفيذ منفِّذ يمكن استخدامه في مشروعك. تستخدم هذه الأداة WASM من SQLite وتخزّن قاعدة البيانات في نظام ملفات المصدر الخاص (OPFS). يتم نشر عامل المثال كحزمة NPM محلية، وبفضل دعم Kotlin لتوابع NPM، يمكن إنشاء وحدة KMP صغيرة لتوفير العامل.

اطّلِع على مشروع GitHub التالي الذي يوضّح كيفية استخدام عامل ويب محلي مع 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)"""))

قد يحتوي إصدار مستقبلي من Web driver على عامل تلقائي منشور في NPM، ما يسهّل عملية إعداد الويب.

أنواع الإرجاع المخصّصة لكائن الوصول إلى البيانات (DAO)

تم تحويل عمليات دمج مختلفة لأنواع القيمة التي تم إرجاعها في DAO، مثل عمليات الدمج الخاصة بـ RxJava وPaging، لاستخدام واجهة برمجة تطبيقات جديدة في Room 3.0 تُعرف باسم محوّلات أنواع القيمة التي تم إرجاعها في DAO. تتيح دالة محوّل نوع القيمة التي تم إرجاعها الخاصة بكائن الوصول إلى البيانات (@DaoReturnTypeConverter) تحويل نتيجة دالة كائن الوصول إلى البيانات إلى نوع مخصّص محدّد بواسطة الدالة التي تمّت إضافة التعليقات التوضيحية إليها. تتيح هذه الدوال المشاركة في الرمز البرمجي الذي ينشئه Room والذي يحوّل نتائج طلب البحث إلى عناصر بيانات. يجب تسجيل الفئات التي تحتوي على محوّلات أنواع القيمة التي تم إرجاعها الخاصة بكائنات الوصول إلى البيانات (DAO) من خلال علامات التوضيح @DaoReturnTypeConverters في بيانات @Database أو @Dao.

على سبيل المثال، لكي يعرض طلب بحث DAO القيمة PagingSource، يجب الآن تسجيل فئة المحوّل الموجودة في androidx.room3:room3-paging:

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

تم نقل عمليات الدمج الحالية إلى محوّلات نوع القيمة التي تم إرجاعها DAO:

نوع القيمة التي يتم إرجاعها فئة المحوّل العناصر
PagingSource PagingSourceDaoReturnTypeConverter androidx.room3:room3-paging
Observable وFlowable وCompletable وSingle وMaybe RxDaoReturnTypeConverters androidx.room3:room3-rxjava3
ListenableFuture GuavaDaoReturnTypeConverter androidx.room3:room3-guava
LiveData LiveDataDaoReturnTypeConverter androidx.room3:room3-livedata

مثل محوّلات أنواع الأعمدة، يمكن تحديد محوّلات أنواع القيمة التي تم إرجاعها الخاصة بكائنات الوصول إلى البيانات (DAO) من خلال التطبيق. على سبيل المثال، يمكن أن يعرّف التطبيق @DaoReturnTypeConverter لنوع الويب kotlin.js.Promise.

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>: (اختياري) يحتوي على الجداول التي تم الوصول إليها في طلب البحث، وهو مفيد في دعم الأنواع القابلة للمراقبة / التفاعلية عند دمجه مع واجهة برمجة التطبيقات InvalidationTracker.createFlow() في Room.
  • rawQuery: RoomRawQuery: (اختياري) يحتوي في وقت التشغيل على مثيل لطلب البحث، ما يتيح إجراء عمليات تحويل، مثل استراتيجية LIMIT / OFFSET التي تنفّذها PagingSourceDaoReturnTypeConverter.
  • executeAndConvert: suspend () -> T: (مطلوب) الدالة التي تم إنشاؤها في Room والتي ستنفّذ طلب البحث وتحلّل نتيجته إلى عناصر بيانات.

لمزيد من المعلومات حول متطلبات إنشاء محوّل لنوع القيمة التي تم إرجاعها الخاص بـ DAO، يُرجى الاطّلاع على KDoc على واجهة برمجة التطبيقات @DaoReturnTypeConverter.