项目:创建 Flight Search 应用

1. 准备工作

前提条件

  • 具备读取和操控关系型数据库的 SQL 基础知识。
  • 能够在 Android 应用中使用 Room 对数据库执行读写操作。
  • 能够使用 DataStore 存储简单的数据。
  • 能够使用 Compose 构建中等复杂的界面。

构建内容

  • 一款 Android 应用,它会要求用户输入出发机场,然后搜索预先填充的数据库以显示从该机场出发的航班列表,并允许用户保存要收藏的航班,还可以通过 Room 更新数据库。

所需条件

  • 一台安装了 Android Studio 的计算机

2. 概览

恭喜您学完了第 6 单元!您首先学习了关系型数据库和结构化查询语言 (SQL) 的概要知识,然后利用 Room 将关系型数据库集成到了应用中,并学习了用于保留设置和界面状态的 Preferences DataStore。现在,该将您学到的知识付诸实践了。

在此项目中,您将构建 Flight Search 应用,用户可以在其中输入机场,并查看以该机场作为出发地的目的地列表。这个项目向您提出了一系列必须满足的应用要求,让您有机会练习使用 SQL、Room 和 DataStore。具体而言,Flight Search 应用需要满足以下要求:

  • 提供文本字段,供用户输入机场名称或国际航空运输协会 (IATA) 机场标识符。
  • 在用户输入内容时查询数据库以提供自动补全建议。
  • 当用户选择建议内容时,生成从该机场出发的航班列表,包括 IATA 标识符和抵达数据库中其他机场的机场名称。
  • 让用户能够保存个人喜欢的路线。
  • 未输入任何搜索查询时,将在列表中显示用户选择的所有收藏航线。
  • 使用 Preferences DataStore 保存搜索文本。当用户重新打开应用时,搜索文本(如果有)需要用来自数据库的相应结果预填充文本字段。

我们为此项目提供了一个预填充的数据库。不过,建议您按照要求从头开始构建该应用,并练习身为 Android 开发者会遇到的实际工作。此项目也是回顾或进一步巩固使用 Compose 构建界面的开发技能的好机会,因为从第 4 单元开始,您不需要执行太多界面工作。

3. 获取航班数据库

此应用的数据来自航班数据库。航班数据库包含两个表:airportfavorite

airport 表包含以下架构。

数据类型

说明

id

INTEGER

唯一标识符(主键)

iata_code

VARCHAR

IATA 代码(3 个字母)

name

VARCHAR

机场全称

passengers

INTEGER

每年的乘客人数

favorite 表包含以下架构。

数据类型

说明

id

INTEGER

唯一标识符(主键)

departure_code

VARCHAR

出发地的 IATA 代码

destination_code

VARCHAR

目的地的 IATA 代码

您可以使用“airport”表格搜索机场并生成潜在航班列表。您可以使用“favorite”表格(最初为空)保存用户选择的出发和到达目的地对。

请从此处下载 SQL Basics GitHub 代码库的 project 分支中的 flight_search.db 文件。

4. 规划应用

规划界面

您可以按自己喜欢的方式设计应用。下面的说明和图片只是一个示例,展示了用户可能会在应用中看到的内容。

当用户首次打开应用时,会看到带有文本字段的空界面,提示输入机场。

当用户开始输入时,应用会显示一个与机场名称或标识符匹配的自动补全建议列表。

38e2daa4d7d3ce47.png

当用户选择建议内容时,该应用会显示从该机场出发的所有可能航班的列表。每个条目都包含两个机场的标识符和名称,以及一个用于将目的地保存到收藏夹的按钮。您可以随意设计布局,前提是它传达了所有必要信息。

555d1fda9bd01095.png

当用户清空搜索框或未输入搜索查询时,应用会显示已保存的收藏目的地列表(如果存在)。

844c9efbca15b5b1.png

使用 Room 集成航班数据库

为了实现上述功能,您需要利用 SQL 和 Room 方面的知识。该数据库已由两个表(airportfavorite)组成,并且您需要每个表的实体。选择相应的 Kotlin 数据类型,以便可以访问每个表中的值。

此外,在查询航班数据库和持久保留数据时,您需要满足以下要求:

  • 在“airport”表格中搜索自动补全建议。请注意,用户可能已经知道机场代码,因此在搜索文本时,您需要对照 iata_code 列和 name 列检查他们的输入。请注意,您可以使用 LIKE 关键字来执行文字搜索。
  • 通过按“passengers”列排序,以降序显示更频繁访问的机场。
  • 假设每个机场都有飞往数据库中其他所有机场的航班(自身除外)。
  • 当搜索框中没有文本时,显示收藏的航班列表,包括出发和目的地。由于“favorite”表格仅包含机场代码列,因此不需要在此列表中显示机场名称。
  • 使用 SQL 和 Room API 执行所有数据库查询。重点在于不要将整个数据库一次性加载到内存中,而是只根据需要检索所需的数据。

使用 Preferences DataStore 保留用户状态

除了 SQL 和 Room 之外,您还知道如何保留个别值(例如用户设置)。对于 Flight Search 应用,您需要将用户的搜索字符串存储在 Preferences DataStore 中,以便在用户重新启动应用时进行填充。如果用户退出应用时该文本字段为空,则需要显示收藏航班的列表。

5. 构建 Flight Search 应用

现在您已阅读所有要求,可以开始构建应用了。虽然本单元只重点介绍数据持久性,但继续积累练习经验非常重要。虽然您已经看过 Flight Search 应用的实际运行示例屏幕截图,但您可以利用本项目打造您自己的独具特色的应用。

虽然您不熟悉这些确切的任务,但您已经了解了构建此项目所需掌握的所有核心概念。如果您遇到困难或需要回顾相关知识,可以参考之前的 Codelab。

在项目实操中,以下资源可能会对您有所帮助:

最重要的是,享受这个过程!学习是一段旅程。即使您觉得这个项目颇具挑战性,也很可能会学习到一些新知识,然后在下次轻松解决同样的问题。祝您学习愉快,期待与您相会于下一个单元!