1. 开始之前
先决条件
- 阅读和操作关系数据库的基本 SQL 知识。
- 能够在 Android 应用中使用 Room 读取和写入数据库。
- 能够使用 DataStore 存储简单数据。
- 能够使用 Compose 构建中等复杂度的用户界面。
你将构建什么
- 一个 Android 应用,它会询问用户出发机场,搜索预先填充的数据库以显示从该机场出发的航班列表,允许用户保存收藏的航班,并使用 Room 更新数据库。
你需要什么
- 装有 Android Studio 的计算机
2. 概述
恭喜你完成了第 6 单元!你从关系数据库和结构化查询语言 (SQL) 的总体概述开始,使用 Room 将关系数据库集成到应用中,并学习了如何使用 Preferences DataStore 来持久保存设置和 UI 状态。现在是时候将你学到的所有知识付诸实践了。
在这个项目中,你将构建航班搜索应用,用户可以在其中输入机场并使用该机场作为出发地查看目的地列表。这个项目为你提供了一个练习 SQL、Room 和 DataStore 技能的机会,它提供了一组你必须满足的应用需求。特别是,你的航班搜索应用需要满足以下要求:
- 提供一个文本字段,供用户输入机场名称或国际航空运输协会 (IATA) 机场标识符。
- 查询数据库,在用户输入时提供自动完成建议。
- 当用户选择建议时,生成从该机场出发的可用航班列表,包括 IATA 标识符和机场名称到数据库中的其他机场。
- 允许用户保存收藏的单个航线。
- 如果没有输入搜索查询,则在列表中显示所有用户选择的收藏航线。
- 使用 Preferences DataStore 保存搜索文本。当用户重新打开应用时,需要使用数据库中的相应结果预填充文本字段中的搜索文本(如果有)。
我们为此项目提供了一个预填充的数据库。但是,期望你根据需求从头开始构建应用程序——这对你作为 Android 开发者的实际工作是一个很好的练习。这个项目也是回顾或进一步完善你使用 Compose 的 UI 构建技能的好机会,因为自从第 4 单元以来,你不需要进行太多 UI 工作。
3. 获取航班数据库
此应用的数据来自航班数据库。航班数据库包含两个表,**airport** 和 **favorite**。
**airport** 表包含以下模式。
列 | 数据类型 | 描述 |
id | INTEGER | 唯一标识符(主键) |
iata_code | VARCHAR | 3 个字母的 IATA 代码 |
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. 规划你的应用
规划你的 UI
欢迎你根据自己的喜好设计你的应用。作为指导,以下描述和图片是用户可能期望在应用中看到的示例。
当用户第一次打开应用时,他们会看到一个空屏幕,其中有一个文本字段,提示输入机场。
当用户开始输入时,应用会显示与机场名称或标识符匹配的自动完成建议列表。
当用户选择建议时,应用会显示从该机场出发的所有可能的航班列表。每个项目都包括两个机场的标识符和名称,以及一个保存目的地为收藏的按钮。只要它传达所有必要的信息,你可以随意试验布局。
当用户清除搜索框或未输入搜索查询时,应用会显示保存的收藏目的地列表(如果存在)。
使用 Room 集成航班数据库
为了实现上述功能,你需要利用你对 SQL 和 Room 的知识。数据库已经包含两个表 **airport** 和 **favorite**,你需要为每个表创建实体。选择适当的 Kotlin 数据类型,以便你可以访问每个表中的值。
此外,在查询航班数据库和持久化数据时,你需要考虑以下要求:
- 在 airport 表中搜索自动完成建议。请记住,用户可能已经知道机场代码,因此在搜索文本时,除了
name
列之外,你还需要检查他们的输入是否与iata_code
列匹配。请记住,你可以使用LIKE
关键字执行文本搜索。 - 通过按 passengers 列排序来显示更频繁访问的机场(按旅客人数降序排列)。
- 假设每个机场都有飞往数据库中其他每个机场的航班(自身除外)。
- 当搜索框中没有文本时,显示收藏航班列表,显示出发地和目的地。由于 favorite 表只包含机场代码列,因此你不需要在此列表中显示机场名称。
- 使用 SQL 和 Room API 执行所有数据库查询。重点是**不要**一次将整个数据库加载到内存中,而只需要根据需要检索所需的数据。
使用 Preferences DataStore 持久保存用户状态
除了 SQL 和 Room 之外,你还知道如何持久保存用户设置等单个值。对于航班搜索应用,你需要将用户的搜索字符串存储在 Preferences DataStore 中,以便在用户重新启动应用时填充它。如果用户退出应用时文本字段为空,则需要显示收藏航班列表。
5. 构建航班搜索应用
现在你已经阅读了所有需求,是时候构建你的应用了。虽然本单元完全专注于数据持久性,但持续获得累积的实践经验非常重要。虽然你已经看到了航班搜索应用实际运行的示例屏幕截图,但这个项目是你让应用成为你自己的机会,并脱颖而出。
虽然这些确切的任务并不熟悉,但你已经掌握了构建此项目所需的所有核心概念。如果你遇到问题或需要复习,可以参考之前的代码实验室。
在你进行项目工作时,以下内容可能对你有用:
最重要的是,享受这个过程!学习是一段旅程。即使你发现这个项目具有挑战性,你可能也会学到一些新东西,然后下次发现同样的问题很容易解决。玩得开心,我们在下一单元再见!