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 开发者进行实际工作的实践。由于您自第 4 单元以来不需要进行太多 UI 工作,该项目也是一个回顾或进一步完善使用 Compose 构建 UI 技能的好机会。
3. 获取航班数据库
此应用的数据来自航班数据库。航班数据库包含两个表:airport 和 favorite。
airport 表包含以下 schema。
列 | 数据类型 | 描述 |
id | INTEGER | 唯一标识符(主键) |
iata_code | VARCHAR | 3 字母 IATA 代码 |
name | VARCHAR | 完整的机场名称 |
passengers | INTEGER | 每年的旅客数量 |
favorite 表包含以下 schema。
列 | 数据类型 | 描述 |
id | INTEGER | 唯一标识符(主键) |
departure_code | VARCHAR | 出发地的 IATA 代码 |
destination_code | VARCHAR | 目的地的 IATA 代码 |
您可以使用 airport 表搜索机场并构建潜在航班列表。您使用 initially empty 的 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. 构建航班搜索应用
现在您已经通读了所有要求,是时候构建您的应用了。尽管本单元只关注数据持久化,但继续进行累积练习很重要。虽然您已经看到过航班搜索应用的示例截图,但此项目是您打造属于自己的应用并脱颖而出的机会。
尽管这些具体任务不熟悉,但您已经掌握了构建此项目所需的所有核心概念。如果您遇到困难或需要复习,可以参考之前的 Codelabs。
在您的项目工作中,以下内容可能对您有用:
最重要的是,享受这个过程!学习是一段旅程。即使您觉得这个项目充满挑战,您可能会学到新的东西,下次再遇到同样的问题时就会觉得很容易解决。祝您玩得开心,下个单元见!