![見出し画像](https://assets.st-note.com/production/uploads/images/136925667/rectangle_large_type_2_98063df1236ea479d2aa64563c67c6da.png?width=1200)
「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つのテーブル間には関係があります。
![](https://assets.st-note.com/img/1712821703675-993sxgRLCo.png?width=1200)
SQLite
wikipediaによると「SQLiteは、パブリックドメインの軽量な関係データベース管理システム (RDBMS) である」とあります。
そして、RDBMSはGoogle Cloudによると「リレーショナル データベースの作成、更新、管理に使用するプログラム」とありますので、
総じて、SQLiteはリレーショナル データベースの作成、更新、管理に使用するプログラムと言えます。
そして、SQLiteで使用する言語が構造化クエリ言語(SQL:読み「シーケル」)です。
ジーニアス英和辞典第五版よると、クエリ(query)とは「問い合わせ」や「データベースの検索」という意味です。
ここからは余談ですが、Codelabsの説明でSQLiteのデータ型は以下の図のようになると示されました。
![](https://assets.st-note.com/img/1712823685464-P9Fg4z1TkE.png?width=1200)
しかし、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 とみなされます。
https://www.sqlite.org/lang_expr.html
![](https://assets.st-note.com/img/1712824298896-E6iZpfO7hu.png?width=1200)
![](https://assets.st-note.com/img/1712824417901-KfqLeMwORe.png?width=1200)
SQL
まずはステートメント、句、集計関数というSQLのグループの説明をします。
ステートメント
ステートメント(=クエリ)は「一文」、「一つの命令」という意味です。ステートメントの最後はセミコロン(;)がつき、実行することが出来ます。
句
句はステートメントの一部を構成する要素であり、命令の条件を書いていると考えた方が分かりやすいです。また、ステートメントの一部なので句だけでは実行できません。
集計関数
集計関数はステートメントが特定の列に対する演算、または計算をできるようにするための関数です。()が付くので分かりやすいと思います。
![](https://assets.st-note.com/img/1712885167188-XBb6pR3ipf.png?width=1200)
![](https://assets.st-note.com/img/1712883953893-qXitJbsBEM.png?width=1200)
![](https://assets.st-note.com/img/1712884046138-1X4ldRt7XX.png?width=1200)
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データベースからデータの読み取りを行います。
![](https://assets.st-note.com/img/1713842225999-D7rymQgEPp.png?width=1200)
![](https://assets.st-note.com/img/1713842552924-suVbdRzl98.png?width=1200)
DISTINCT句で重複を排除
読み取りたい列の要素が重複することを認めない場合はDISTINCTを付けます。
![](https://assets.st-note.com/img/1713842245714-InPMJQAAAz.png?width=1200)
![](https://assets.st-note.com/img/1713842655493-YwkRwB1l4e.png?width=1200)
WHERE句でのフィルタ
ステートメントをフィルタしたい場合はWHEREの後に条件を書きます。
![](https://assets.st-note.com/img/1713842263910-45Zv3lZYIp.png?width=1200)
![](https://assets.st-note.com/img/1713842443722-DvuMXYmAYN.png?width=1200)
LIKE演算子を使用してテキストを検索する
特定の列にあるテキストを検索する場合はWHEREとLIKEを用います。
![](https://assets.st-note.com/img/1713842289336-FfQxWFg54t.png?width=1200)
![](https://assets.st-note.com/img/1713842370092-yflW9w3HFQ.png?width=1200)
GROUP BY句で結果をグループ化
指定した列に同じ値を持つ全ての行が結果の中で隣接するようにグループ化したい場合はGROUP BYを用います。
つまり、集合関数の結果を別々のグループで分ける場合に用いられます。
![](https://assets.st-note.com/img/1713842484725-oT5dbtLJ5T.png?width=1200)
下の例ではまず、folderの値はspamとinboxの二種類があります。
GROUP BYが無い場合はemailの総数のみを返します。
一方、GROUP BYを使いfolderでグループ化すると、inbox, spam毎の総数を返します。
![](https://assets.st-note.com/img/1713841716560-Rt7eqBKjXu.png?width=1200)
![](https://assets.st-note.com/img/1713841871513-oqJo7TZJHG.png?width=1200)
ORDER BY句で結果を並び替え
OREDER BY句を使用するとクエリの結果を列名を基に並び替えることが出来ます。ASCは昇順(これがデフォルト)、DESCは降順です。
![](https://assets.st-note.com/img/1713843007851-TuT1unwt0D.png?width=1200)
![](https://assets.st-note.com/img/1713842804145-guka6KR7ys.png?width=1200)
LIMIT句とOFFSET句で結果の件数を制限
LIMITは帰ってくる結果の最大値を決定します。
一方、OFFSETは指定した行数をスキップ出来ます。
![](https://assets.st-note.com/img/1713843208280-nXW7tREoxb.png?width=1200)
![](https://assets.st-note.com/img/1713843314311-t3grp2Unah.png?width=1200)
INSERTステートメントでデータを挿入
INSERTステートメントを使用するとデータベースに新しい行を追加できます。追加したいデータはVALUESの後の()内にデータベースの列と同じ順序で書きます。
![](https://assets.st-note.com/img/1713861449350-KPJWUDXWOY.png?width=1200)
![](https://assets.st-note.com/img/1713861759357-EQAyetVFM1.png?width=1200)
![](https://assets.st-note.com/img/1713861799436-kUagdm9McD.png?width=1200)
UPDATEステートメントでデータを更新
UPDATEステートメントを使用すると既存のデータの一つ以上の列の値を更新できます。
![](https://assets.st-note.com/img/1713861827099-wIu4qvp4t7.png?width=1200)
![](https://assets.st-note.com/img/1713862032975-S93U6hnXDw.png?width=1200)
![](https://assets.st-note.com/img/1713862054846-RhP8cpc1kE.png?width=1200)
DELETEステートメントでデータを排除する
DELETEステートメントを使用するとテーブルから1つ又は複数の行を排除できます。
![](https://assets.st-note.com/img/1713862083973-SxqvolE2kq.png?width=1200)
![](https://assets.st-note.com/img/1713862193750-KdzuNZhwrK.png?width=1200)
![](https://assets.st-note.com/img/1713862216522-EHeHrCKJgF.png?width=1200)
注意点
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
![](https://assets.st-note.com/img/1712824029658-7LPU5JUuaM.png)
対処法としては、Query Tabを閉じて再度Query Tabを開いてください
![](https://assets.st-note.com/img/1712824154901-3jgV66OcTB.png)
さいごに
今回もCodelabsでの学習お疲れさまでした!
今回の内容は普段と比べて分かりにくい概念も難しい要素もないので、ここまで学習してきた方からすると楽勝だったのではないでしょうか?
次のパスウェイはこのユニットの目玉のRoomライブラリの使用方法です。
是非、次のパスウェイも取り組んでください!
この記事が気に入ったらサポートをしてみませんか?