חדשות על המוצר

‫Room 3.0 – מודרניזציה של Room

משך הקריאה: 4 דקות
לצפייה בפרופיל של דניאל סנטיאגו ריברה
Daniel Santiago Rivera מהנדס תוכנה

גרסת האלפא הראשונה של Room 3.0 הושקה. גרסה 3.0 של Room היא גרסה ראשית של הספרייה שמתמקדת ב-Kotlin Multiplatform‏ (KMP) ומוסיפה תמיכה ב-JavaScript וב-WebAssembly‏ (WASM) בנוסף לתמיכה הקיימת ב-Android, ב-iOS וב-JVM למחשב. 

בפוסט הזה בבלוג אנחנו מתארים את השינויים שעלולים לגרום לכשל, את הסיבות לפיתוח של Room 3.0 ואת הפעולות השונות שאפשר לבצע כדי לעבור מ-Room 2.0.

שינויים בתוכנה שעלולים לגרום לכשלים

‫Room 3.0 כולל את השינויים הבאים ב-API שעלולים לגרום לכשל: 

  • הפסקת התמיכה בממשקי ה-API של SupportSQLite: גרסה 3.0 של Room נתמכת באופן מלא על ידי ממשקי ה-API של מנהל ההתקן androidx.sqlite. ממשקי ה-API של SQLiteDriver תואמים ל-KMP, והסרת התלות של Room ב-API של Android מפשטת את פני השטח של ה-API ל-Android כי היא מונעת שני קצוות עורפיים אפשריים.
  • אין יותר יצירת קוד ב-Java: גרסה 3.0 של Room יוצרת קוד ב-Kotlin בלבד. השינוי הזה תואם לפרדיגמה המתפתחת של Kotlin-first, אבל גם מפשט את בסיס הקוד ואת תהליך הפיתוח, ומאפשר איטרציות מהירות יותר.
  • התמקדות ב-KSP: אנחנו גם מפסיקים את התמיכה ב-Java Annotation Processing (AP) וב-KAPT. ‫Room 3.0 הוא מעבד KSP (עיבוד סמלים של Kotlin) בלבד, שמאפשר עיבוד טוב יותר של בסיסי קוד של Kotlin בלי להיות מוגבל על ידי שפת Java.
  • קודם כל קורוטינות: גרסה Room 3.0 כוללת קורוטינות של Kotlin, כך שממשקי ה-API שלה הם קודם כל קורוטינות. שגרות ההמשך הן מסגרת אסינכרונית שתואמת ל-KMP, והפיכת Room לאסינכרוני היא דרישה קריטית לתמיכה בפלטפורמות אינטרנט.

חבילה חדשה

כדי למנוע בעיות תאימות עם הטמעות קיימות של Room 2.x, וגם בספריות עם יחסי תלות טרנזיטיביים ל-Room (לדוגמה, WorkManager),‏ Room 3.0 נמצא בחבילה חדשה. כלומר, יש לו גם קבוצת Maven חדשה ומזהי פריטים חדשים. לדוגמה, androidx.room:room-runtime הפך ל-androidx.room3:room3-runtime, ומחלקות כמו androidx.room.RoomDatabase נמצאות עכשיו ב-androidx.room3.RoomDatabase.

‫Kotlin ושגרות המשך (coroutines) קודם

בלי יצירת קוד Java, גרסה 3.0 של Room דורשת גם את KSP ואת המהדר של Kotlin, גם אם בסיס הקוד שמקיים אינטראקציה עם Room הוא ב-Java. מומלץ להשתמש בפרויקט עם כמה מודולים שבו השימוש ב-Room מרוכז, ואפשר להחיל את הפלאגין של Kotlin ל-Gradle ואת KSP בלי להשפיע על שאר בסיס הקוד.

בנוסף, ב-Room 3.0 צריך להשתמש ב-Coroutines, ובאופן ספציפי יותר, פונקציות DAO צריכות להיות מושהות, אלא אם הן מחזירות סוג ריאקטיבי, כמו Flow. ב-Room 3.0 אי אפשר לחסום פונקציות DAO. במסמכי התיעוד של שגרות המשך ב-Android מוסבר איך מתחילים לשלב שגרות המשך באפליקציה.

מעבר לממשקי SQLiteDriver API

במסגרת המעבר מ-SupportSQLite, האפליקציות יצטרכו לעבור לממשקי ה-API של SQLiteDriver. ההעברה הזו חיונית כדי ליהנות מכל היתרונות של Room 3.0, כולל האפשרות להשתמש בספריית SQLite הכלולה דרך BundledSQLiteDriver. אתם יכולים להתחיל להעביר את ממשקי ה-API של מנהלי ההתקנים כבר היום באמצעות Room 2.7.0 ואילך. מומלץ מאוד להימנע משימוש נוסף ב-SupportSQLite. אם תעבירו את השילובים של Room לממשקי ה-API של SQLiteDriver, המעבר ל-Room 3.0 יהיה קל יותר כי השינוי בחבילה כולל בעיקר עדכון של הפניות לסמלים (ייבוא) ויכול להיות שיצריך שינויים מינימליים באתרי הקריאה.

סקירה כללית קצרה על ממשקי ה-API של SQLiteDriver זמינה במאמרי העזרה של ממשקי ה-API של SQLiteDriver.

פרטים נוספים על העברת Room לשימוש בממשקי SQLiteDriver API זמינים במסמכי התיעוד הרשמיים בנושא העברה מ-SupportSQLite.

Room SupportSQLite wrapper

אנחנו מבינים שלא בכל הפרויקטים אפשר להסיר את SupportSQLite באופן מיידי. כדי להקל על המעבר הזה, בגרסה Room 2.8.0, הגרסה העדכנית של סדרת Room 2.0, הוספנו פריט מידע חדש שנקרא androidx.room:room-sqlite-wrapper. הארטיפקט הזה מציע API תואם שמאפשר להמיר RoomDatabase ל-SupportSQLiteDatabase, גם אם ממשקי ה-API של SupportSQLite במסד הנתונים הושבתו בגלל התקנה של SQLiteDriver. זהו פתרון זמני למפתחים שצריכים עוד זמן כדי להעביר את בסיס הקוד שלהם באופן מלא. הארטיפקט הזה ממשיך להתקיים ב-Room 3.0 בתור androidx.room3:room3-sqlite-wrapper כדי לאפשר את המעבר ל-Room 3.0, ועדיין לתמוך בשימוש קריטי ב-SupportSQLite.

לדוגמה, אפשר להחליף קריאות ל-roomDatabase.openHelper.writableDatabase ב-roomDatabase.getSupportWrapper(), ויינתן wrapper גם אם מתבצעת קריאה ל-setDriver() ב-Room's builder.

פרטים נוספים זמינים במסמכי התיעוד של room-sqlite-wrapper.

תמיכה ב-Room וב-SQLite באינטרנט

התמיכה ב-Kotlin Multiplatform מטרגטת את JS ו-WasmJS, וכוללת כמה מהשינויים המשמעותיים ביותר ב-API. באופן ספציפי, הרבה ממשקי API ב-Room 3.0 הם פונקציות השעיה, כי התמיכה המתאימה באחסון באינטרנט היא אסינכרונית. גם ממשקי ה-API של SQLiteDriver עודכנו כדי לתמוך באינטרנט, ודרייבר אסינכרוני חדש לאינטרנט זמין ב-androidx.sqlite:sqlite-web. זהו מנהל התקן שמבוסס על Web Worker ומאפשר לשמור את מסד הנתונים במערכת הקבצים הפרטית של המקור (OPFS).

פרטים נוספים על הגדרת Room for the Web זמינים בנתוני הגרסה של Room 3.0.

סוגי החזרה מותאמים אישית של DAO

ב-Room 3.0 נוספה היכולת להוסיף ל-Room שילובים בהתאמה אישית, בדומה ל-RxJava ול-Paging. באמצעות ממשק API חדש להערות שנקרא @DaoReturnTypeConverter, אתם יכולים ליצור שילוב משלכם כך שהקוד שנוצר על ידי Room יהיה נגיש בזמן הריצה. כך פונקציות @Dao יכולות לקבל את סוגי ההחזרה המותאמים אישית שלהן בלי שתצטרכו לחכות שצוות Room יוסיף את התמיכה. השילובים הקיימים מועברים לשימוש בפונקציונליות הזו, ולכן מי שמסתמך עליה יצטרך להוסיף את הממירים להגדרות של @Database או @Dao.

לדוגמה, הממיר של Paging נמצא בקובץ ה-artifact‏ androidx.room3:room3-paging והוא נקרא PagingSourceDaoReturnTypeConverter. לעומת זאת, ב-LiveData הממיר נמצא ב-androidx.room3:room3-livedata ונקרא LiveDataDaoReturnTypeConverter.

פרטים נוספים זמינים בקטע "ממירי סוג החזרה של DAO" בנתוני הגרסה של Room 3.0.

מצב תחזוקה של Room 2.x

מאחר שהפיתוח של Room יתמקד ב-Room 3, גרסת Room 2.x הנוכחית נכנסת למצב תחזוקה. כלומר, לא יפותחו תכונות משמעותיות, אבל עדיין יתבצעו גרסאות תיקון (2.8.1,‏ 2.8.2 וכו') עם תיקוני באגים ועדכוני תלות. הצוות מחויב לעבודה הזו עד שגרסה 3 של Room תהיה יציבה.

סיכום

אנחנו מאוד מתלהבים מהפוטנציאל של Room 3.0 ומההזדמנויות שהוא פותח לסביבה העסקית של Kotlin. אנחנו ממשיכים לפתח את התכונה, אז כדאי לעקוב אחרי העדכונים.

כותב/ת המסמך:
להמשך קריאה