專案:建立 Flight Search 應用程式

1. 事前準備

必要條件

  • 具備使用 SQL 讀取及操控關聯資料庫的基礎知識。
  • 能夠在 Android 應用程式中使用 Room 讀取資料庫內容及寫入資料。
  • 能夠使用 DataStore 儲存簡易資料。
  • 能夠使用 Compose 建構中度複雜的使用者介面。

建構項目

  • 您建構的 Android 應用程式會要求使用者輸入出發機場、搜尋預先填入的資料庫來顯示從該機場出發的航班清單、讓使用者儲存喜愛的航班,並且透過 Room 更新資料庫。

軟硬體需求

  • 搭載 Android Studio 的電腦

2. 總覽

恭喜您完成單元 6!您一開始先掌握了關聯資料庫和結構化查詢語言 (SQL) 的大致概念,接著使用 Room 將關聯資料庫整合至應用程式,然後瞭解用於保存設定和使用者介面狀態的 Preferences DataStore。現在就開始應用所學吧!

在這項專案中,您將建構 Flight Search 應用程式,讓使用者輸入機場,並查看以該機場做為出發地點的目的地清單。本專案提供了此應用程式必須符合的一系列要求,以便您練習有關 SQL、Room 及 DataStore 的技能。具體要求如下:

  • 顯示文字欄位,讓使用者輸入機場名稱或國際航空運輸協會 (IATA) 機場 ID。
  • 查詢資料庫,在使用者輸入內容時提供自動完成建議。
  • 當使用者選擇任一建議時,應用程式要產生一份清單,列出從指定機場前往資料庫中其他機場的可選航班,並附上 IATA ID 和機場名稱。
  • 讓使用者儲存喜愛的個別航線。
  • 如果使用者未輸入搜尋查詢,應用程式要在清單中顯示使用者選擇的所有喜愛航線。
  • 透過 Preferences DataStore 儲存搜尋文字。當使用者重新開啟應用程式時,應用程式必須在文字欄位中預先填入搜尋文字 (如果有的話),並顯示資料庫中符合需求的結果。

我們為這項專案提供了預先填入的資料庫。不過,您應該按照各項要求從頭開始建構應用程式,練習 Android 開發人員的實際作業內容。對使用 Compose 建構 UI 而言,本專案也是複習及增進相關技能的好機會,畢竟從單元 4 開始就不太需要處理 UI 工作。

3. 取得航班資料庫

這個應用程式的資料是來自航班資料庫。此資料庫含有兩份資料表:airportfavorite

airport 資料表包含下列結構定義。

資料類型

說明

id

INTEGER

不重複 ID (主鍵)

iata_code

VARCHAR

由 3 個字母組成的 IATA 代碼

name

VARCHAR

機場全名

passengers

INTEGER

每年乘客人數

favorite 資料表包含下列結構定義。

資料類型

說明

id

INTEGER

不重複 ID (主鍵)

departure_code

VARCHAR

出發機場的 IATA 代碼

destination_code

VARCHAR

目的地機場的 IATA 代碼

您可以將 airport 資料表用於搜尋機場,以及製作可選航班的清單。favorite 資料表原本沒有任何內容,用途為儲存使用者選取的出發地點與目的地組合。

請按這裡,從 SQL Basics 的 GitHub 存放區 project 分支中下載 flight_search.db 檔案。

4. 規劃應用程式

規劃 UI

無論想以何種方式設計應用程式都沒問題。請參考下列示例說明和圖片,瞭解應用程式中應向使用者顯示的內容。

使用者首次開啟應用程式時,會看到空白畫面,內含提示輸入機場的文字方塊。

一旦使用者開始輸入內容,應用程式要顯示一份清單,列出符合機場名稱或 ID 的自動完成建議。

38e2daa4d7d3ce47.png

使用者選取任一建議後,應用程式要顯示一份清單,列出從指定機場出發的所有可選航班。每個項目都包含出發機場和目的地機場的 ID 與名稱,並提供一個按鈕,讓使用者儲存喜愛的航線。只要能夠傳達所有必要資訊,您可以多方嘗試調整版面配置。

555d1fda9bd01095.png

如果使用者清除搜尋框中的內容,或者並未輸入搜尋查詢,應用程式要顯示一份清單,列出已儲存的喜愛航線。

844c9efbca15b5b1.png

使用 Room 整合航班資料庫

如要實作上述功能,就必須充分運用 SQL 和 Room 相關知識。資料庫已包含兩份資料表 (airportfavorite),您需要為每份資料表建立實體。請選取適當的 Kotlin 資料類型,以便存取各資料表中的值。

此外,在查詢航班資料庫及保存資料時,還要考量下列要求:

  • 在 airport 資料表中搜尋自動完成建議。提醒您,使用者可能知道機場代碼,因此您在搜尋文字時,需要將使用者輸入內容與「name」及「iata_code」欄比對。請注意,您可以使用 LIKE 關鍵字搜尋文字。
  • 根據「passengers」欄的值,依遞減順序將搜尋結果排序,優先顯示較多乘客造訪的機場。
  • 假定每座機場都有航班前往資料庫中的其他所有機場。
  • 如果搜尋框中沒有文字,應用程式要列出喜愛航班清單,顯示出發地點和目的地。由於 favorite 資料表不含機場名稱欄,只有機場代碼欄,因此這份清單中不應顯示機場名稱。
  • 使用 SQL 和 Room API 執行所有資料庫查詢。重點在於「不要」一次將整個資料庫載入記憶體,只要視需求擷取必要資料即可。

使用 Preferences DataStore 保存使用者狀態

除了 SQL 和 Room 外,您也瞭解如何保存使用者設定等個別的值。針對 Flight Search 應用程式,您必須將使用者的搜尋字串儲存到 Preferences DataStore,以便在使用者重新啟動應用程式時填入該字串。如果在使用者退出應用程式時,文字欄位沒有任何內容,那麼您需要顯示喜愛航班清單。

5. 建構 Flight Search 應用程式

仔細閱讀所有要求後,現在就可以開始建構應用程式了!雖然本單元只著重說明資料持續性,但在既有技能的基礎上運用新知識依然相當重要。縱使可以參考螢幕截圖中的 Flight Search 應用程式實例,不過仍建議您把握這項專案提供的機會,發揮個人巧思打造出色應用程式。

即便還不熟悉實際作業內容,您也已經掌握建構本專案所需的核心概念。如果遇到困難或需要複習,請查看先前的程式碼研究室。

製作專案時,下列課程可能會很有幫助:

最重要的是要盡情享受過程!學習是一段旅程。即使您認為這項專案太具挑戰性,仍有可能習得新的知識,下次遇到相同問題時就能更容易解決。希望您能樂在其中,下個單元見!