Side Project 的好夥伴 — Cloud Firestore

邱懷民
一個被音樂耽誤的Android工程師
5 min readDec 20, 2018

大家好,我是懷民!一個大學剛畢業正在等當兵的 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 的基本操作:新增、更新、刪除

  1. 新增 newThing().collection(TABLE_THINGS) 是用來指到你想要的 table,add() 中可以放任何不為 null 的型態。
  2. 刪除 deleteThing().document(id) 是指定該 table 中的特定文件。
  3. 更新 doneThing().update() 裡面的參數排列是 field_name, value,要更新多個欄位就以此類推排下去。

使用 Snapshot Listener 來監聽 table 的即時更動

這邊宣告了一個 LiveData todoList 來暫存 Firestore 的資料,在 when 裡面可以針對該 table 中 added, removed 和 modify 的資料來做相對應的動作。

而 Firestore 有以下兩點貼心的設計。

  1. 會在 user 裝置上建立資料庫,如此一來沒網路還是可以拿到最近一次同步的資料。
  2. 當下如果是沒有網路的情況,所有的操作會被塞進 Job Queue 裡面,等待下一次連線時做完。

補充兩個 Firestore 實用的小技巧

  1. 以上操作都可以在後面加上 .addOnCompleteListener() 來接收 callback
  2. 可以宣告一個 List<ListenerRegistration> 來存所有 Snapshot Listener的操作,並在 ViewModel onCleared() 去 remove 他們就可以確保他們不會繼續在背景執行摟!

最後,來講講 UI 的部分吧!

整個畫面只有一個 RecyclerView + FloatingActionButton 而已,比較費工的地方是在 item view 身上。

CheckBox 的部分是用 AirBnb 推出的一款 Lottie 實作的。簡單來說他能夠讀取 json 格式的動畫檔,而且 LottieFiles 這個網站上有超多免費的資源!對我這種不會設計的工程師真的是一大福音 😍

Item 的動畫效果則是用了原生提供的 DiffUtil,只要提供比對規則,就能將兩個 List 間的差異 dispatch 給 Adapter 做更新,對於這種有新增、刪除和移動位置的需求真的很方便!

附上 Repo 連結,有興趣的可以看看!謝謝大家 🙌

--

--

邱懷民
一個被音樂耽誤的Android工程師

喜歡抱著吉他彈彈唱唱,夢想是靠著寫程式改變世界。