1. 始める前に
前提条件
- リレーショナル データベースの読み取りと操作に関する SQL の基本的な知識。
- Android アプリで Room を使用して、データベースの読み取りと書き込みができること。
- DataStore を使用して簡単なデータを保存できること。
- Compose でやや複雑なユーザー インターフェースを構築できること。
作成するアプリの概要
- ユーザーに出発空港を尋ね、事前入力済みのデータベースを検索してその空港から出発するフライトのリストを提示し、ユーザーが好みのフライトを保存したり、データベースを Room で更新したりできる Android アプリ。
必要なもの
- Android Studio がインストールされているパソコン
2. 概要
ユニット 6 が完了しました。リレーショナル データベースと構造化クエリ言語(SQL)の概要から始め、Room を使用してリレーショナル データベースをアプリに統合し、設定と UI 状態を保持するための Preferences DataStore について学びました。それでは、学んだことを実践してみましょう。
このプロジェクトでは、ユーザーが入力した空港を出発地とした目的地のリストを表示できる Flight Search アプリを作成します。満たすべき一連のアプリ要件が提示されることで、SQL、Room、DataStore のスキルを磨く機会が得られます。具体的には、Flight Search アプリは次の要件を満たす必要があります。
- ユーザーが空港名または国際航空運送協会(IATA)の空港 ID を入力するためのテキスト フィールドを設ける。
- データベースに対しクエリを行い、ユーザーの入力に応じてオートコンプリートの候補を提示する。
- ユーザーが候補を選択したら、その空港(IATA ID や空港名など)からデータベース内の他の空港に向かう、利用可能なフライトのリストを生成する。
- ユーザーが好みの経路を個別に保存できる。
- 検索クエリが入力されていない場合は、ユーザーが選択した好みの経路をすべてリスト表示する。
- Preferences DataStore を使用して検索テキストを保存する。ユーザーがアプリを再度開いたとき検索テキストがあれば、テキスト フィールドにデータベースから適切な結果が自動的に入力されるようにする。
このプロジェクトには、事前入力済みのデータベースが用意されています。ただし、Android デベロッパーとして実際に行う作業の練習として、要件に沿ってアプリをゼロから構築することを想定しています。ユニット 4 以降 UI を扱う必要があまりなかったため、このプロジェクトは、Compose で UI 構築スキルを再確認したり上達させたりする良い機会でもあります。
3. フライト データベースを取得する
このアプリのデータはフライト データベースから取得されます。フライト データベースには、airport と favorite という 2 つのテーブルがあります。
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. アプリを計画する
UI を計画する
アプリのデザインは自由に決めてください。目安として、以下の説明と画像はアプリに表示される内容の一例です。
ユーザーが初めてアプリを開くと、空白の画面にテキスト フィールドが表示され、空港を入力するよう求められます。
ユーザーが入力を開始すると、空港名または ID に一致するオートコンプリートの候補のリストが表示されます。
ユーザーが候補を選択すると、その空港から出発するすべてのフライトのリストが表示されます。各項目には、両方の空港の ID と名前が記載され、目的地をお気に入りとして保存するためのボタンが設けられています。必要な情報がすべて伝わるのであれば、どのようなレイアウトにしても構いません。
ユーザーが検索ボックスをクリアした場合、または検索クエリを入力しなかった場合、保存したお気に入りの目的地のリストがあれば表示されます。
Room を使用してフライト データベースを統合する
前述の機能を実装するには、SQL と Room に関する知識を活用する必要があります。データベースはすでに airport と favorite という 2 つのテーブルで構成されており、それぞれに対してエンティティが必要です。各テーブルの値にアクセスできるように、適切な Kotlin データ型を選択します。
また、フライト データベースのクエリとデータの保持を行う際は、次の要件を考慮する必要があります。
- airport テーブルでオートコンプリートの候補を検索します。ユーザーは空港コードをすでに知っている可能性があるため、テキストを検索する際は、
name
列だけでなくiata_code
列に対する入力も確認する必要があることに留意してください。LIKE
キーワードを使用してテキスト検索を実施できます。 - passengers 列で並べ替えて、訪問頻度の高い空港を降順で表示します。
- すべての空港に、データベース内の(その空港自体を除く)他のすべての空港行きのフライトがあると仮定します。
- 検索ボックスにテキストが入力されていない場合は、お気に入りフライトリストを表示して、出発地と目的地を示します。favorite テーブルには空港コードの列しかないため、このリストに空港名を表示する必要はありません。
- データベース クエリはすべて、SQL と Room API を使用して実施します。つまり、データベース全体を一度にメモリに読み込むのではなく、必要なときに必要なデータだけを取得するということです。
Preferences DataStore を使用してユーザーの状態を保持する
SQL や Room に加え、ユーザー設定などの個々の値を保持する方法についても学びました。Flight Search アプリの場合、ユーザーの検索文字列を Preferences DataStore に保存し、ユーザーがアプリを再起動したときにデータが入力されるようにする必要があります。ユーザーがアプリを終了したときにテキスト フィールドが空だった場合は、代わりにお気に入りフライトリストを表示する必要があります。
5. Flight Search アプリを作成する
すべての要件を確認したところで、次はアプリを作成します。このユニットではデータの保持のみに焦点を当てていますが、引き続き練習を積み重ねていくことが重要です。Flight Search アプリのスクリーンショットの例を実際に見てきましたが、このプロジェクトではアプリを独自仕様にして際立たせることができます。
これらのタスクそのものには馴染みがなくても、このプロジェクトに必要となる主要なコンセプトはすべて説明済みです。行き詰まった場合や復習が必要な場合は、以前の Codelab を参照してください。
このプロジェクトには次のリンクが役立ちます。
最も重要なことは、プロセスを楽しむことです。学びは旅のようなものです。このプロジェクトが難しいと感じても、何か新しいことを学べば、次回は同じ問題を簡単に解決できることでしょう。それでは、次のユニットでお会いしましょう。