Advertisement
  1. Code
  2. Android SDK

使用Cloud Firestore創建壹個權重跟蹤器應用程序

by
Read Time:13 minsLanguages:

Chinese (Traditional) (中文(繁體)) translation by tianyiliang (you can also view the original English article)

現在將應用程序的數據存儲在雲中是非常重要的,因為用戶傾向於擁有多個設備,並希望他們的應用程序在所有應用程序中同步。使用 Cloud Firestore,Firebase平臺上提供的實時NoSQL數據庫,這樣做比以前更容易,更安全。

之前的教程中,我向您介紹了Cloud Firestore必須提供的所有強大功能。今天,我將向您展示如何將其與其他Firebase產品(如FirebaseUI Auth和Firebase Analytics)壹起使用,以創建簡單但高度可擴展的重量跟蹤器應用。

准备工作

要遵循這個分步教程,您需要:

  • Android Studio的最新版本
  • 壹個Firebase帳戶
  • 以及運行Android 5.0或更高版本的設備或模擬器

項目設置

為了能夠在Android Studio項目中使用Firebase產品,您需要Google服務Gradle插件,Firebase配置文件和壹些  implementation 依賴關系。借助Firebase助手,您可以非常輕松地完成這些任務。

通過轉到工具> Firebase打開助手。接下來,選擇Analytics(分析)  選項,然後點擊記錄分析事件  鏈接。

Fierbase Assistant panelFierbase Assistant panelFierbase Assistant panel

您現在可以按連接到Firebase  按鈕將您的Android Studio項目連接到新的Firebase項目。

Connect to Firebase dialogConnect to Firebase dialogConnect to Firebase dialog

但是,要實際添加插件和implementation 依賴項,您還需要按添加分析到您的應用程序  按鈕。

我們今天創建的重量跟蹤器應用程序將具有兩個功能:存儲權重並將其顯示為按逆時間順序排序的列表。當然,我們將使用Firestore來存儲權重。 但是,要將它們顯示為列表,我們將使用FirebaseUI  庫中提供的與Firestore相關的組件。因此,將以下implementation 依賴項添加  到app 模塊的build.gradle  文件中:

用戶必須只能查看自己的權重,而不能查看使用該應用的所有人的權重。因此,我們的應用程序需要有唯壹識別其用戶的能力。FirebaseUI Auth提供了此功能,因此請在下面添加以下依賴項:

我們還將需要壹些Material Design小部件來為我們的應用提供令人愉悅的外觀。因此,請確保將“設計支持”庫和“ 材料對話框”  庫作為依賴項添加。

最後,按立即同步  按鈕更新項目。

2.配置Firebase身份驗證

Firebase身份驗證支持各種身份提供商。但是,它們全都是默認禁用的。要啟用其中的壹個或多個,您必須訪問Firebase 控制

在控制臺中,選擇您在上壹步中創建的Firebase項目,轉到其身份驗證  部分,然後按設置登錄方法  按鈕。

Firebase Authentication home screenFirebase Authentication home screenFirebase Authentication home screen

要允許用戶使用Google帳戶登錄我們的應用,請啟用Google  作為提供商,為項目提供壹個有意義的面向公眾的名稱,然後按下保存  按鈕。

Google identity provider configurationGoogle identity provider configurationGoogle identity provider configuration

Google是您可以使用的最簡單的身份提供商。它不需要配置,您的Android Studio項目不需要任何額外的依賴關系。

3.配置雲Firestore

您必須先啟用Firebase控制臺中的Firestore,然後才能開始使用它。為此,請轉到數據庫  部分,然後按下Cloud Firestore Beta  卡 中的開始使用按鈕。

Cloud Firestore cardCloud Firestore cardCloud Firestore card

現在將提示您為數據庫選擇安全模式。確保妳選擇了開始鎖定模式  選項並按下啟用  按鈕。

Security mode selection screenSecurity mode selection screenSecurity mode selection screen

在鎖定模式下,默認情況下,沒有人能夠訪問或修改數據庫的內容。 因此,您現在必須創建壹個安全規則,允許用戶只讀取和寫入屬於他們的文檔。首先打開規則  選項卡。

在為我們的數據庫創建安全規則之前,我們必須確定我們要如何在其中存儲數據。假設我們將有壹個名為users 包含代表我們用戶的文檔的頂級集合。 這些文檔可以具有唯壹的ID,這些ID與Firebase身份驗證服務為用戶生成的ID相同。

由於用戶將在其文檔中添加多個權重條目,因此使用子集合來存儲這些條目是理想的。我們稱之為子集合  weights

Firestore database structureFirestore database structureFirestore database structure

基於上述模式,我們現在可以為路徑創建壹個規則  users/{user_id}/weights/{weight}。規則是,只有當{user_id} 變量等於用戶的Firebase身份驗證ID時,才允許用戶讀取和寫入路徑。

因此,更新規則編輯器的內容。

最後,按發布  按鈕來激活規則。

4.驗證用戶

只有當用戶使用Google帳戶登錄時,我們的應用才能使用。因此,壹旦它打開,它必須檢查用戶是否擁有有效的Firebase身份驗證ID。 如果用戶確實擁有該ID,則應該繼續並呈現用戶界面。否則,它應該顯示登錄屏幕。

要檢查用戶是否有ID,我們可以簡單地檢查 該類的currentUser 屬性  FirebaseAuth是否為空。如果它為空,我們可以通過調用 類的createSignInIntentBuilder() 方法來創建登錄意圖  AuthUI

以下代碼顯示了Google如何為身份提供者這樣做:

請註意,showUI() 如果已經存在有效的ID ,我們正在調用壹個名為的方法。此方法尚不存在,因此現在創建它並保留其主體為空。

要捕捉登錄意圖的結果,我們必須重寫onActivityResult() 活動的  方法。在該方法內部,如果resultCode 參數的值  是,RESULT_OK 並且該currentUser 屬性不再為空,則表示用戶設法成功登錄。 在這種情況下,我們必須再次調用該  showUI() 方法來呈現用戶界面。

如果用戶未能登錄,我們可以顯示敬酒並通過調用finish() 方法關閉應用程序  。

因此,將以下代碼添加到活動中:

此時,如果您第壹次運行該應用程序,則應該可以看到如下所示的登錄屏幕:

Account selection dialogAccount selection dialogAccount selection dialog

在後續的運行中 - 感謝Google Smart Lock(默認情況下啟用),您將自動登錄。

5.定義布局

我們的應用程序需要兩種布局:壹種用於主要活動,另壹種用於重量條目,這些條目將作為反向時間順序列表的項目顯示。

主要活動的布局必須有壹個RecyclerView 小部件,它將充當列表,還有壹個FloatingActionButton 小部件,用戶可以按下該小部件來創建新的重量條目。將它們都放置在RelativeLayout 小部件中後,您的活動的布局XML文件應如下所示:

我們已經關聯了壹個addWeight() 用  FloatingActionButton 小部件命名的點擊事件處理程序。該處理程序尚不存在,因此在該活動內部為其創建壹個存根。

為了保持權重條目的布局簡單,我們將在其中只有兩個  TextView 小部件:壹個用於顯示權重,另壹個用於顯示創建條目的時間。使用壹個LinearLayout 小部件作為它們的容器就足夠了。

因此,創建壹個名為weight_entry.xml的新布局XML文件 ,並向其添加以下代碼:

6.創建壹個模型

在之前的步驟中,您看到每個重量條目都有壹個與其相關的重量和時間。為了讓Firestore知道這壹點,我們必須為重量輸入創建壹個模型。

Firestore模型通常是具有所需成員變量的簡單數據類。

現在也是為每個重量條目創建視圖持有者的好時機。正如您可能已經猜到的,視圖持有者將由RecyclerView 小部件使用來呈現列表項。 因此,創建壹個名為的新類WeightEntryVH,它擴展了  RecyclerView.ViewHolder 類,並為這兩個TextView 小部件創建了成員變量  。 不要忘記使用該findViewById() 方法來初始化它們。以下代碼顯示了如何簡潔地執行操作:

7.創建唯壹的用戶文檔

當用戶嘗試首次創建權重條目時,我們的應用程序必須users 在Firestore 的集合內為用戶創建單獨的文檔。正如我們之前所做的決定,文檔的ID只是用戶的Firebase身份驗證ID,可以使用 對象的uid 屬性獲取currentUser

為了獲得對users 集合的引用  ,我們必須使用 類的collection() 方法  FirebaseFirestore。然後,我們可以調用它的  document() 方法並將其uid 作為參數傳遞  以創建用戶的文檔。

在閱讀和創建權重條目時,我們需要訪問用戶特定的文檔。為了避免兩次編碼上述邏輯,我建議妳為它創建壹個單獨的方法。

請註意,該文檔將僅為每個用戶創建壹次。換句話說,只要用戶使用同壹個Google帳戶,多次調用上述方法將始終返回同壹文檔。

8.添加權重條目

當用戶按下我們應用程序的浮動操作按鈕時,他們必須能夠創建新的重量條目。 為了讓他們輸入權重,現在讓我們創建壹個包含EditText 小部件的對話框。使用Material Dialog庫,這樣做非常直觀。

裏面的addWeight() 方法,它作為上單擊該按鈕的事件處理程序,創建壹個MaterialDialog.Builder 實例,並調用它title() 和  content() 方法,讓您的對話框標題和有意義的消息。同樣,調用該inputType() 方法並將其TYPE_CLASS_NUMBER 作為參數傳遞給它,以確保用戶只能在對話框中輸入數字。

接下來,調用input() 方法來指定壹個提示並將壹個事件處理程序與該對話框相關聯。處理程序將接收用戶輸入的權重作為參數。

最後,確保您調用該show() 方法來顯示對話框。

在事件處理程序內部,我們現在必須添加代碼來實際創建並填充新的權重條目文檔。由於文檔必須屬於weights 用戶唯壹文檔的集合,因此要訪問集合,必須調用該  collection() 方法返回的文檔的  getUserDocument() 方法。

壹旦妳擁有了這個集合,妳就可以調用它的add() 方法並將壹個新的WeightEntry 類的實例傳遞給它來存儲條目。

在上面的代碼中,您可以看到我們正在使用 該類的time 屬性  Date將時間戳與條目關聯。

如果您現在運行該應用程序,則應該可以將新權重條目添加到Firestore。您目前尚未在應用中看到它們,但它們將在Firebase控制臺中顯示。

Add weight dialogAdd weight dialogAdd weight dialog

9.顯示重量輸入

現在是填充RecyclerView 布局小部件的時候了。 因此,首先使用該findViewById() 方法為其創建壹個引用,並為其分配壹個新的LinearLayoutManager 類實例  。這必須在showUI() 我們之前創建的方法內完成  。

RecyclerView 小部件必須顯示weights 用戶文檔集合中存在的所有  文檔。 此外,最新的文件應該首先出現。為了滿足這些要求,我們現在必須通過調用collection() 和orderBy() 方法來創建壹個查詢  。

為了提高效率,可以通過調用limit() 方法來限制查詢返回的值的數量。

以下代碼創建壹個查詢,該查詢返回用戶創建的最後90個權重條目:

使用查詢,我們現在必須創建壹個FirestoreRecyclerOptions 對象,稍後我們將使用它來配置我們的RecyclerView 小部件的適配器。 當您將query 實例傳遞  給setQuery() 其構建器的  方法時,請確保指定返回的結果是WeightEntry 對象的形式。以下代碼顯示了如何執行此操作:

您可能已經註意到,我們正在將當前活動作為FirestoreRecyclerOptions 對象的生命周期所有者  。這樣做很重要,因為我們希望我們的適配器適當地響應常見的生命周期事件,例如用戶打開或關閉應用程序。

此時我們可以創建壹個FirestoreRecyclerAdapter 對象,它使用該  FirestoreRecyclerOptions 對象來配置它自己。因為  FirestoreRecyclerAdapter 該類是抽象的,所以Android Studio應該自動覆蓋它的方法來生成如下所示的代碼:

正如妳所看到的,這個FirestoreRecyclerAdapter 班級與班級非常相似  RecyclerView.Adapter 。事實上,它是從它派生出來的。這意味著您可以像使用RecyclerView.Adapter 課程壹樣使用它。

onCreateViewHolder() 方法內部,妳需要做的就是膨脹weight_entry.xml  布局文件,並 根據它返回壹個WeightEntryVH視圖持有者對象.

在該onBindViewHolder() 方法中,您必須使用model 參數來更新TextView 視圖持有者中存在的小部件的內容。

雖然更新weightView 小部件很簡單,但更新timeView 小部件有點復雜,因為我們不想直接向用戶顯示以毫秒為單位的時間戳。

將時間戳轉換為可讀日期和時間的最簡單方法是使用DateUtils類的  formatDateTime() 方法。 除了時間戳之外,該方法還可以接受幾種不同的標誌,它們將用於格式化日期和時間。您可以自由使用符合您偏好的標誌。

最後,不要忘記將RecyclerView 小部件指向我們剛剛創建的適配器。

該應用已準備就緒。您現在應該能夠添加新條目並且幾乎立即看到它們出現在列表中。如果您在具有相同Google帳戶的其他設備上運行該應用,則會在其上看到相同的權重條目。

Weight entries shown as a listWeight entries shown as a listWeight entries shown as a list

結論

在本教程中,您了解了如何使用Cloud Firestore作為數據庫為Android創建功能完備的體重跟蹤器應用程序,其速度和容易程度如何。隨意添加更多功能! 我也建議您嘗試在Google Play上發布它。借助Firebase Spark  計劃,該計劃目前可免費提供1 GB的數據存儲空間,您至少可以為幾千名用戶提供服務。

當妳在這裏時,看看我們關於Android應用程序開發的其他文章!

关注我们的公众号
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.