[Android] ทดสอบลองใช้งาน Room Database ร่วมกับ Paging Library 3 (Alpha)
ในบทความนี้ผู้เขียนจะลองทดสอบนำ ROOM DB มาใช้งานร่วมกับ Paging Lirary3 ในการแสดงผลข้อมูลในแอปของเรากันครับ
จากบทความที่แล้วทดสอบใช้งาน Kotlin Flow ร่วมกับ Room Database ไปแล้ว คราวนี้เราจะมาทดลองใช้งาน Room Database ร่วมกับ Paging Library3 กันต่อครับ แต่หมายเหตุไว้ก่อนว่า ณ เวลาที่เขียนบทความนี้ Paging Library3 ยังอยู่ในสถานะ Alpha 06 อยู่ ฉะนั้น เมื่อยังไม่ stable อาจจะยังจะมีการเปลี่ยนแปลงปรับปรุงตัว Library อยู่เสมอ หากจะนำไปใช้ในโปรเจกจริง หรือ production อาจจะต้องยอมรับในข้อนี้ หรือจะรอใช้จริงอีกทีในโปรเจกตอน stable ก็ได้ครับ
Setup Room Database
Room Database ที่เราจะใช้จำเป็นจะต้องเป็น Version 2.3.0-alpha01 เป็นต้นไป เนื่องจาก Room ได้เพิ่มการรองรับการ @Query ให้ return type เป็น Paging Source ของ Paging Library 3 ที่ Version นี้ ให้เราทำการเพิ่ม dependencies เข้าไปในโปรเจก ดังนี้
เริ่มต้นสร้าง Room Database
Entity
ก่อนอื่นเราต้องทำการสร้าง Room Database ในโปรเจกนี้ โดยเริ่มจากทำการสร้าง Entity หรือ table ของข้อมูล ที่ชื่อว่า Cheese ภายใน table Cheese ก็จะมีแค่ข้อมูลง่าย ๆ คือ id และ name ดังนี้
Dao (Data Access Object)
และด้วยความสามารถของ Room Database Version 2.3.0-alpha01 ท่ีถูกพัฒนามาเพื่อรองรับการใช้งานร่วมกับ Paging Library3 โดยเราสามารถ @Query ให้ return type ข้อมูลออกมาเป็น PagingSource ได้เลย ช่วยให้เราสะดวกมากในการใช้งาน
สร้าง Room Database
จากนั้นทำการสร้าง RoomDatabase ขึ้นมา โดยประกอบด้วย Entity คือ Cheese จากนั้นเราจะทำการทดสอบเพิ่มข้อมูลจำลองเข้าไปหลังจากสร้าง Database สำเร็จ ที่ onCreate ของฟังก์ชัน addCallback อีกทีครับ
Paging Library
หลังจาก setup ส่วนของ Room Database เสร็จเรียบร้อย ต่อไปเราจะทำการสร้าง flow ของ PagingData จากตัวอย่าง จะสร้างเป็น use case ชื่อ GetAllCheeseUseCase ที่มีหน้าที่ในการสร้าง pagingData ของ Cheese โดยกำหนดค่า PagingConfig และกำหนด Paging source ที่ได้จาก Room คือ cheeseDb.cheeseDao().allCheeseByName() ลงไป
จากนั้นใน view model ก็ทำการ inject แต่ละ use case เข้ามา และเรียกใช้งาน ที่ฟังก์ชัน fetchAllCheeses ทำการเรียก getAllCheeseUseCase และเมื่อได้รับข้อมูลกลับมาก็ set value ให้กับ allCheese ที่เป็น LiveData<PagingData<Cheese>> ต่อไปใน activity เราก็แค่ทำการ observe ค่านี้ เพื่อส่งค่าไปให้ adapter ต่อไป
สร้าง adapter ชื่อ CheeseAdapter สำหรับการใช้งานร่วมกับ pagingLibrary จะต้องสร้าง adapter แแบบ PagingDataAdapter รูปแบบการสร้างก็จะคล้ายกับ ListAdapter โดยมีหน้าตาประมาณนี้
ถัดมาที่ CheeseActivity ก็ทำการ initial adapter ให้เรียบร้อย จากนั้นทำการ observe ค่าที่ได้มาจาก viewModel ที่ไปเรียก getAllCheeseUseCase ที่ฟังก์ชัน cheeseViewModel.onAllCheese() เมื่อเราได้รับค่ามา ก็ทำการสั่งให้ adapter.submitData แต่มีข้อสังเกตุ จะต้องอยู่ภายใต้ lifecyclerScope แค่นี้แอปก็จะแสดงผลข้อมูลได้แล้วครับ
ตัวอย่างแอป
สรุป
หลังจากได้ทดลองใช้งาน Paging Library 3 ร่วมกันกับ Room Database ที่ถูกพัฒนาเพิ่มการ @query ให้ return type เป็น Paging Source ได้เลย ทำให้เราใช้งานได้สะดวกสบายขึ้นมาก แค่เพียงเขียน query เพื่อดึงข้อมูลที่เราต้องการ จากนั้นส่งค่า dataSource จาก Room ให้ paging3 library จัดการ ทำการสร้าง adapter และ observe ข้อมูลเพื่อ submit data เพียงเท่านี้แอปก็จะแสดงผลข้อมูลได้แล้ว
ซึ่งในบทความนี้ลองทดสอบใช้งานร่วมกับ Room Database แต่ยังมี use case กรณีที่ต้องการใช้งาน Paging3 ในการดึงข้อมูลจาก API มาแสดงผล หรือดึงข้อมูลจาก API มาเก็บไว้ใน Room ก่อน และใช้ข้อมูลจาก Room มาแสดงผลก็ได้เช่นกัน ซึ่งใครสนใจสามารถศึกษาเพิ่มเติมได้จาก Codelabs ได้ที่ลิ้งค์นี้ครับ Android Paging Codelabs และหากเมื่อ Library นี้ถูกพัฒนาจน stable เมื่อไร คงได้มีการนำมาใช้ในโปรเจกกันมากขึ้น ๆ แน่นอน
ที่มา
ตัวอย่าง Source Code