Side Project 的好夥伴 — Cloud Firestore
大家好,我是懷民!一個大學剛畢業正在等當兵的 Android 工程師。第一次寫文章還請各位前輩們多多指教。
這次想跟大家分享一個 Firebase 提供的服務 — Cloud Firestore,主打著 Realtime 而且擁有強大的查詢和調整資源配置的功能。很適合我這種不會寫後端的工程師使用 😆 雖然這個服務還在 beta 階段,但已經很夠拿來寫寫 Side project 了!
這篇文章會示範如何用 Firestore 實作下面這個簡單的待辦事項 App 🔥
首先,我們需要在 Firebase Console 中新增專案。設定完成後記得將 google-services.json 下載到專案中。
我自己習慣手動操作,也可以使用 Android Studio 內的 Firebase plugin 輔助
設定 database 的讀寫權限
這個專案只是做 demo 使用,所以方便起見才開放所有權限。如果有串 Google 或是 Facebook Auth. 的話也可以在這邊限制只讓登入者存取!還有其他更詳細的權限操作都在這邊。
在 gradle 中加入 plugin 和 dependency 並加入網路權限
sdk 的最新版本可以在這裡找到
// Project level
classpath 'com.google.gms:google-services:4.2.0'// App level
apply plugin: 'com.google.gms.google-services'implementation 'com.google.firebase:firebase-core:16.0.6'
implementation 'com.google.firebase:firebase-firestore:17.1.4// Android Manifests
<uses-permission android:name="android.permission.INTERNET" />
建立待辦事項的 data class
id
用來存 firestore 的 document id,type
是事項的種類,timestamp
則是拿來排序用的。
接著是 Firestore 的基本操作:新增、更新、刪除
- 新增 newThing():
.collection(TABLE_THINGS)
是用來指到你想要的 table,add()
中可以放任何不為 null 的型態。 - 刪除 deleteThing():
.document(id)
是指定該 table 中的特定文件。 - 更新 doneThing():
.update()
裡面的參數排列是field_name, value
,要更新多個欄位就以此類推排下去。
使用 Snapshot Listener 來監聽 table 的即時更動
這邊宣告了一個 LiveData todoList
來暫存 Firestore 的資料,在 when
裡面可以針對該 table 中 added, removed 和 modify
的資料來做相對應的動作。
而 Firestore 有以下兩點貼心的設計。
- 會在 user 裝置上建立資料庫,如此一來沒網路還是可以拿到最近一次同步的資料。
- 當下如果是沒有網路的情況,所有的操作會被塞進 Job Queue 裡面,等待下一次連線時做完。
補充兩個 Firestore 實用的小技巧
- 以上操作都可以在後面加上
.addOnCompleteListener()
來接收 callback - 可以宣告一個
List<ListenerRegistration>
來存所有Snapshot Listener
的操作,並在 ViewModelonCleared()
去 remove 他們就可以確保他們不會繼續在背景執行摟!
最後,來講講 UI 的部分吧!
整個畫面只有一個 RecyclerView
+ FloatingActionButton
而已,比較費工的地方是在 item view 身上。
CheckBox 的部分是用 AirBnb 推出的一款 Lottie 實作的。簡單來說他能夠讀取 json 格式的動畫檔,而且 LottieFiles 這個網站上有超多免費的資源!對我這種不會設計的工程師真的是一大福音 😍
Item 的動畫效果則是用了原生提供的 DiffUtil,只要提供比對規則,就能將兩個 List 間的差異 dispatch 給 Adapter 做更新,對於這種有新增、刪除和移動位置的需求真的很方便!
附上 Repo 連結,有興趣的可以看看!謝謝大家 🙌