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 基础知识 GitHub 存储库的 project
分支下载 flight_search.db
文件 这里。
4. 规划你的应用程序
规划你的 UI
欢迎你根据自己的喜好设计应用程序。作为指南,以下描述和图像是一个示例,说明用户可能希望在应用程序中看到的内容。
当用户第一次打开应用程序时,他们会看到一个带有文本字段的空白屏幕,提示输入机场。
当用户开始输入时,应用程序会显示一个自动完成建议列表,这些建议与机场名称或标识符匹配。
当用户选择一个建议时,应用程序会显示从该机场出发的所有可能航班的列表。每个项目包括两个机场的标识符和名称,以及一个按钮,用于将目的地保存为收藏。请随意尝试不同的布局,只要它能传达所有必要的信息即可。
当用户清除搜索框或不输入搜索查询时,应用程序会显示已保存的收藏目的地的列表(如果存在)。
使用 Room 集成航班数据库
为了实现上述功能,你需要利用你对 SQL 和 Room 的了解。数据库已经包含两个表,airport 和 favorite,你需要为每个表创建实体。选择合适的 Kotlin 数据类型,以便你可以访问每个表中的值。
此外,在查询航班数据库和持久化数据时,你需要考虑以下需求:
- 在 airport 表中搜索自动完成建议。请记住,用户可能已经知道机场代码,因此你需要在搜索文本时检查他们的输入与
iata_code
列,以及name
列。请记住,你可以使用LIKE
关键字执行文本搜索。 - 通过对 passengers 列进行排序,按降序显示访问频率更高的机场。
- 假设每个机场都有航班飞往数据库中的所有其他机场(除了它本身)。
- 当搜索框中没有文本时,显示收藏航班的列表,显示出发地和目的地。由于 favorite 表只包含机场代码的列,因此你不需要在此列表中显示机场名称。
- 使用 SQL 和 Room API 执行所有数据库查询。重点是不将整个数据库一次性加载到内存中,而是在需要时只检索必要的数据。
使用 Preferences DataStore 持久化用户状态
除了 SQL 和 Room 之外,你还知道如何持久化用户设置等单个值。对于航班搜索应用程序,你需要将用户的搜索字符串存储在 Preferences DataStore 中,以便在用户重新启动应用程序时填充它。如果用户退出应用程序时文本字段为空,则需要显示收藏航班的列表。
5. 构建航班搜索应用程序
现在你已经通读了所有需求,现在是时候构建你的应用程序了。虽然这个单元专门关注数据持久化,但继续积累实践经验很重要。虽然你已经看到了航班搜索应用程序在行动中的示例屏幕截图,但这个项目是你让应用程序独一无二的机会。
虽然这些确切的任务并不熟悉,但你已经掌握了构建这个项目所需的所有核心概念。如果你遇到困难或需要复习,可以参考之前的代码实验室。
以下内容可能在你的项目中对你有所帮助:
最重要的是,享受这个过程!学习是一个旅程。即使你发现这个项目很有挑战性,你可能也会学到一些新东西,然后下次发现同样的问题很容易解决。玩得开心,我们下一单元再见!