Cloud Firestore 的資料查詢與原本的Realtime database最大的不同,是它提供了多條件的查詢功能,這可是原 Firebase 資料庫最難達成的,可說是想將 Firebase 應用在實際專案時的惡夢。現在,Firestore 出現後,實現雲端資料庫再也不頭痛了。
在看本篇心得之前,建議先建立環境、導入 Firestore,並實作過資料新增與 Model 的設計:
使用 Android Studio 3 開發新世代旗艦雲端資料庫 Cloud Firestore 之首部曲,類別庫導入與設定
Cloud Firestore 之二部曲,資料新增讓你的 APP 馬上成為雲端應用
Cloud Firestore 之三部曲,設計資料類別(Model)快速新增複雜資料
查詢所有資料
使用 Query 類別可建立查詢物件,可以從任一個資料集合( CollectionReference )中查詢資料,其中,查詢所有資料可使用 limit(int limit)方法,設定你想要的最大筆數,我的 users 資料集只有 8 筆資料,但我傳入 100,代表最多到 100 筆。
Query 類別的 get 方法一呼叫後,會立即往雲端 Firestore 取得資料,為了得到非同步查詢的結果,仍然需要使用 OnCompleteListener,這次,我使用 lambda 語法,以簡化複雜度,如下:
若實作過先前的文章,應該知道 Task 類別的 isSuccessful() 方法可以得知工作的結果成功與否,但它還有個功用,就是儲存工作完成後的結果,可呼叫 getResult() 方法得到 QuerySnapshot 物件。因為這裏我的工作是查詢,因此可用forEach迴圈將查詢結果一個一個讀出來,重點是,讀到的 DocumentSnapshot 物件有個很好用的 toObject 方法,可以很直覺的取得 User 物件。
執行結果如下:
若再加上 RecyclerView 清單顯示使用者資料,需要設計 Adapter 後,再將 List<User> 集合設定給 Adapter 後,即可在畫面中顯示所有使用者清單,如下圖:
多條件查詢
在之前的 Firebase realtime database 中,複合查詢是最大的痛處,現在 Firestore 完全能簡單地達成了。例如,我想篩選出姓別為女生,且年齡大於 18 歲的使用者,現在只需要在建立 Query 物件時,加上 whereXX 方法:
圖中的 whereEqualTo 是姓別等於女性,第二個 whereGreaterThan 是年齡大於 18 歲,它們的關係是 AND 且,但如果查詢中涵蓋等於(==)與大於、小於的複合式查詢前,得先建立複合索引,否則上面的程式執行後會拋出 NullPointerException ,原因是查出來的 querySnapshot 是 null值。
建立複合索引
回到 Firestore 主控台,點擊 索引標籤後,手動新增索引,如下圖:
接著建立我想要複合查詢的姓別與年齡兩個資料欄位加入索引,如下圖:
按下建立索引後會需要一段時間,等待它建立完成後的結果如下:
提示: 索引欄位的順序要與查詢時的順序相同。
現在可以執行複合查詢測試了,得到的 LogCat 輸出符合條件的三個使用者,如下圖: