見出し画像

「COMPOSE を用いた ANDROID アプリ開発の基礎」の学習支援⑰ -ユニット6パスウェイ1

皆さん、こんにちは!又はこんばんは!初めての方は初めまして!
Google Codelabsの「COMPOSE を用いた ANDROID アプリ開発の基礎」コースのお手伝いをする「りおん」です。
今回は、ユニット6「データの永続化」のパスウェイ1「SQLの概要」です。

この記事はCodelabsの補足を目的としているため、「COMPOSE を用いた ANDROID アプリ開発の基礎」コースで心配になった時、エラーが起きて詰まった時や、分からないことがあった時、軽く復習したい時に見てください!
また、目次を見て自分に必要なところだけ見るのをお勧めします!

この記事を作成するにあたり使用しているAndroid StudioのバージョンはGiraffeです。バージョンによってはUIが違うことがあるのでご了承ください。
また、2024年4月23日現在の「COMPOSE を用いた ANDROID アプリ開発の基礎」コースを参考にしています。


はじめに

今回の内容は特別難しい単語や概念、手法はありません。
そのため、今回は学習内容をまとめた記事になっています。

学習内容

リレーショナルデータベース(RDB)

リレーショナルデータベースとは、日本語で「関係データベース」と訳されるように、複数のテーブルがある際にテーブル間の関係をモデル化できるデータベースのことです。
下の画像では生徒テーブルに、担当テーブルの主キーである担任IDが外部キーとして存在しているためこの2つのテーブル間には関係があります。

リレーショナルデータベースの例

SQLite

wikipediaによると「SQLiteは、パブリックドメインの軽量な関係データベース管理システム (RDBMS) である」とあります。
そして、RDBMSはGoogle Cloudによると「リレーショナル データベースの作成、更新、管理に使用するプログラム」とありますので、
総じて、SQLiteはリレーショナル データベースの作成、更新、管理に使用するプログラムと言えます。
そして、SQLiteで使用する言語が構造化クエリ言語SQL:読み「シーケル」)です
ジーニアス英和辞典第五版よると、クエリ(query)とは「問い合わせ」や「データベースの検索」という意味です。

ここからは余談ですが、Codelabsの説明でSQLiteのデータ型は以下の図のようになると示されました。

Kotlinのデータ型とSQLiteのデータ型との対応表

しかし、SQLiteのデータ型を検索してもBOOLEANは無いように、内部ではBOOLEANというデータ型はないと思われます。
SQLiteの公式文書でも"見なされる"と書かれています。

数値ゼロ値 (整数値 0 または実数値 0.0) は false とみなされます。 NULL 値は NULL のままです。他の値はすべて true とみなされます。

たとえば、値 NULL、0.0、0、「english」、「0」はすべて false とみなされます。値 1、1.0、0.1、-0.1、および '1english' は true とみなされます。

「SQLiteで理解されるSQL」より
https://www.sqlite.org/lang_expr.html
App Inspectionで確認してもtrue,falseではなく0,1で表されている
また、WHERE句でtrueと書いても実行できるが、赤線が引かれる。

SQL

まずはステートメント、句、集計関数というSQLのグループの説明をします。

ステートメント
ステートメント(=クエリ)は「一文」、「一つの命令」という意味です。ステートメントの最後はセミコロン(;)がつき、実行することが出来ます。


句はステートメントの一部を構成する要素であり、命令の条件を書いていると考えた方が分かりやすいです。また、ステートメントの一部なので句だけでは実行できません。

集計関数
集計関数はステートメントが特定の列に対する演算、または計算をできるようにするための関数です。()が付くので分かりやすいと思います。

SELECTステートメント
句が無くても実行はできる。勿論、条件にあてはまるものは無い
句だけの場合は実行できない

SQLに関する単語

ステートメント
読み取り…SELECT
書き込み…INSERT, UPDATE, DELETE など
https://www.sqlite.org/lang_transaction.htmlより)


FROM句, DISTINCT句, WHERE句, GROUP BY句, ORDER BY句, LIMIT句, OFFSET句

集計関数
COUNT(), SUM(), AVG(), MIN(), MAX()

演算子
LIKE, IN, AND, OR, NOT (+, -, /なども勿論あります)
https://www.sqlite.org/lang_expr.htmlより)

他のステートメントや句を知りたい場合はCodelabsの関連リンク、又は以下のサイトをお勧めします。

SELECTステートメントでデータを読み取る

SELECTステートメントは、SQLiteデータベースからデータの読み取りを行います。

テーブルから指定した列を読み取る
emailテーブルからsubject列を読み取る

DISTINCT句で重複を排除

読み取りたい列の要素が重複することを認めない場合はDISTINCTを付けます。

テーブルから指定した列を読み取る(重複は除く)
emailテーブルからsender列(重複なし)を読み取る

WHERE句でのフィルタ

ステートメントをフィルタしたい場合はWHEREの後に条件を書きます。

テーブルから条件を満たす指定した列を読み取る
emailテーブルからfolderが"inbox"であるid, folder列を読み取る

LIKE演算子を使用してテキストを検索する

特定の列にあるテキストを検索する場合はWHEREとLIKEを用います。

特定の列に指定した文字列が含まれるという条件
emailテーブルからsubjectに"fool"という文字列がある列を全て読み取る

GROUP BY句で結果をグループ化

指定した列に同じ値を持つ全ての行が結果の中で隣接するようにグループ化したい場合はGROUP BYを用います。
つまり、集合関数の結果を別々のグループで分ける場合に用いられます。

指定した列でグループ化する

下の例ではまず、folderの値はspamとinboxの二種類があります。
GROUP BYが無い場合はemailの総数のみを返します。
一方、GROUP BYを使いfolderでグループ化すると、inbox, spam毎の総数を返します。

GROUP BYを使用しない場合
GROUP BYを使用した場合

ORDER BY句で結果を並び替え

OREDER BY句を使用するとクエリの結果を列名を基に並び替えることが出来ます。ASCは昇順(これがデフォルト)、DESCは降順です。

指定した列を指定した方針で並び替える
emailテーブルからsenderの昇順にidとsenderの列を全て読み取る。ASCは省略可

LIMIT句とOFFSET句で結果の件数を制限

LIMITは帰ってくる結果の最大値を決定します。
一方、OFFSETは指定した行数をスキップ出来ます。

結果の最大値とスキップする行数を決める
senderの名前が早いものから3個読み取る。ただし、1,2番目に早いものは除く

INSERTステートメントでデータを挿入

INSERTステートメントを使用するとデータベースに新しい行を追加できます。追加したいデータはVALUESの後の()内にデータベースの列と同じ順序で書きます。

テーブルに新しい行を追加する
データテーブルに新しいデータ(NULL, "INSERTで追加したデータ"…)を追加する
結果としてid = 45に追加されている

UPDATEステートメントでデータを更新

UPDATEステートメントを使用すると既存のデータの一つ以上の列の値を更新できます。

テーブル内で条件を満たす列の値を更新
id = 45のデータのreadとsubjectの値を更新
結果としてid = 45のデータが更新されている

DELETEステートメントでデータを排除する

DELETEステートメントを使用するとテーブルから1つ又は複数の行を排除できます。

テーブル内の条件を満たす行を排除
id = 45のデータのを排除
結果としてid = 45のデータがテーブルから排除されている

注意点

Query Tabで実行(Run)を押すとエラーが出る

Query Tabで実行(Run)を押すと以下のようなエラー文が出ることがあります。
エラー文
Error retrieving data from table.: near ";": syntax error (code 1 SQLITE_ERROR): , while compiling: SELECT * FROM (SELECT * FROM email; ) LIMIT 0, 1

エラー文

対処法としては、Query Tabを閉じて再度Query Tabを開いてください

Close Tab

さいごに

今回もCodelabsでの学習お疲れさまでした!
今回の内容は普段と比べて分かりにくい概念も難しい要素もないので、ここまで学習してきた方からすると楽勝だったのではないでしょうか?
次のパスウェイはこのユニットの目玉のRoomライブラリの使用方法です。
是非、次のパスウェイも取り組んでください!

この記事が気に入ったらサポートをしてみませんか?