どうもこんばんわ。
アオナツラインを完走しました。
ことねちゃんが可愛かったです。続きが気になるから後日談みたいなのが欲しいと思った。
BGMモードでOPの曲が聞けないので初回限定版を買えばよかったかなってちょっと後悔してたりもする。
本題
JetpackComposeでErogameScapeの情報を表示するアプリを作ってみます。
環境
なまえ | あたい |
---|
Jetpack Compose | Beta05 |
今回の仕組み的な
ErogameScapeっていうエロゲ専門サイトがあるんですが、これSQLを書いてPOSTするとなんとデータが返ってきます。このサイトやばい
使うテーブル
- gamelist
- brandlist
- gamelistにはブランド名が入ってないので別に取得
- campaign_game、campaignlist
campaign_game
テーブルなんですが、なんかここのテーブル一覧には乗っていないのですが、他の人が書いたSQLではなぜかセール中のゲームが取得できるんですよね。
それでテーブル一覧を返すSQLを書いて見るとたしかにあるんですね。テーブル一覧のサイトが更新されていないだけかな。
今回使うSQL文
JetpackComposeが本題なのに時間がかかってしまった。
ゲームの情報のほか、ブランド名、セール中ならセール情報を表示するようにしました。
id | gamename | content | name | end_timestamp | furigana | sellday | brandname | brandname | model | median | average2 | stdev | count2 | dmm | max2 | min2 | shoukai |
27418 | アオナツライン | | | | アオナツライン | 2019-03-29 | 84 | 戯画 | PC | 82 | 80 | 13 | 348 | eg_0012 | 100 | 0 | http://products.web-giga.com/aonatsu/ |
29203 | アオナツライン | | | | アオナツライン | 2020-04-23 | 781 | エンターグラム | PS4 | 78 | 78 | 18 | 2 | | 90 | 65 | http://www.entergram.co.jp/aonatsu/ |
29204 | アオナツライン | | | | アオナツライン | 2020-04-23 | 781 | エンターグラム | PSV | 87 | 87 | 3 | 3 | | 90 | 85 | http://www.entergram.co.jp/aonatsu/ |
セール中ならこうなります。
id | gamename | content | name | end_timestamp | furigana | sellday | brandname | brandname | model | median | average2 | stdev | count2 | dmm | max2 | min2 | shoukai |
20228 | 彼女のセイイキ | 1,017円 50%OFF | スプリングセール 2021 | 2021-05-10 17:00:00 | カノジョノセイイキ | 2014-12-19 | 702 | feng | PC | 75 | 74 | 9 | 665 | feng_0003 | 100 | 10 | http://www.feng.jp/seiiki/ |
簡単に解説
SELECT
は取り出す列を書き出していきます。
FROM
はどこのテーブルから取り出すかです。まずはゲームの情報の入ってるテーブルですね。
それから、INNER JOIN
を利用してブランド名テーブルを結合します。ON
のあとの条件式に当てはまれば結合されます。
複数のテーブルを扱う場合はテーブル名のあとに名前をつけることが出来ます(この例ではg
とかb
とか)
COALESCE
ってのはNULLのときに変わりに表示する値をセットできるやつです。今回はNULLの場合-1
を入れるようにしてあります。
AS 名前
は列の名前を変えるときに使うんですが今回はスクレイピングしちゃうのであんまり関係ない。
セール中ならセール情報を取る
LEFT OUTER JOIN
っていうのは、ON
の条件式が当てはまらないときには代わりにNULLを入れてくれるやつです。
INNER JOIN
を使ってしまうとセールしてるときは表示されますが、セールしてないときは表示されなくなってしまいます。
で、LEFT OUTER JOIN
のあとのSELECT
ですが、これはサブクエリって呼ばれるやつでクエリ内で使う値をクエリを使って取り出すときに使います。
このクエリを実行すると、以下のような内容が返ってきます。campaign_game
とcampaignlist
のテーブルを結合して、セール中であるものを取得するクエリです。
content | name | game | end_timestamp |
---|
1,017円 50%OFF | スプリングセール 2021 | 20228 | 2021-05-10 17:00:00 |
この結果を、LEFT OUTER JOIN
で結合します。上のサンプルではc
をクエリ結果の名前として指定しているため、c.content
でセールの値段を取得することが出来ます。
WHERE g.gamename = 'アオナツライン'
はゲーム名が「アオナツライン」と一致するものを取得するという意味です。
疲れたのであとは各自調べて。
その他使うものとしては
- ViewModel / LiveData
- SQLをPOSTする処理をActivityに書くわけに行かないので
- OkHttp
- Jsoup
- Glide
- Coroutine
ライブラリ入れる
AndroidManifest.xml
インターネットパーミッションを忘れずに
データクラス
GameData.kt
データ取得関数を書く
ErogameScape.kt
ViewModel
MainViewModel.kt
通信はここでやってる。
JetpackCompose
ViewModelで取得したデータを表示するようにしましょう。
各種部品を用意する
検索ボックスと、インターネット上の画像を表示するための部品を
GameInfoUI.kt
結果画面
UI作るの難しい。
あとアイコンを https://fonts.google.com/icons から持ってきたので各自入れてね
GameInfoScreen.kt
MainActivity
動かすとこんな感じ
UI作るのって難しいよな
終わりに
ソースコードあります。
https://github.com/takusan23/ErogameScapeDroid/tree/efa4137b777c4e069ebc7fa3eda5fcbccdba7500