Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

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

by
Difficulty:IntermediateLength:LongLanguages:

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 panel

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

Connect to Firebase dialog

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

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

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

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

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

2.配置Firebase身份驗證

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

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

Firebase Authentication home screen

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

Google identity provider configuration

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

3.配置雲Firestore

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

Cloud Firestore card

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

Security mode selection screen

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

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

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

Firestore 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 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 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 list

結論

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

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

关注我们的公众号
Advertisement
Advertisement
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.