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. 获取航班数据库
此应用的数据来自航班数据库。航班数据库包含两个表:airport 和 favorite。
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. 规划应用
规划界面
您可以按自己喜欢的方式设计应用。下面的说明和图片只是一个示例,展示了用户可能会在应用中看到的内容。
当用户首次打开应用时,会看到带有文本字段的空界面,提示输入机场。
当用户开始输入时,应用会显示一个与机场名称或标识符匹配的自动补全建议列表。
当用户选择建议内容时,该应用会显示从该机场出发的所有可能航班的列表。每个条目都包含两个机场的标识符和名称,以及一个用于将目的地保存到收藏夹的按钮。您可以随意设计布局,前提是它传达了所有必要信息。
当用户清空搜索框或未输入搜索查询时,应用会显示已保存的收藏目的地列表(如果存在)。
使用 Room 集成航班数据库
为了实现上述功能,您需要利用 SQL 和 Room 方面的知识。该数据库已由两个表(airport 和 favorite)组成,并且您需要每个表的实体。选择相应的 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。
在项目实操中,以下资源可能会对您有所帮助:
最重要的是,享受这个过程!学习是一段旅程。即使您觉得这个项目颇具挑战性,也很可能会学习到一些新知识,然后在下次轻松解决同样的问题。祝您学习愉快,期待与您相会于下一个单元!