まず初めに、僕はまだKotlinを習得できていません
そのためJavaで記述しています Kotlinの時代来てるのツラ・・・
よくお世話になるMaterial DialogのライブラリはすでにJavaの説明が無い
Roomを使用するというアイデアの発端は「SharedPreferenceじゃ物足りないけどSQLite databaseは使いたくない」というもの
SQLite3って毎回Wrapperとか作るの冗長だしテスト多いしエラーが怖いというのがあって、以前からSharedPreferenceみたいに使えるDatabaseのライブラリを探しておりました
Room Persistence Library
https://developer.android.com/topic/libraries/architecture/room
半年前くらいにGoogleから公式に提供されているライブラリのようでContentProviderとかSQLiteHelperとかそこらへんを意識せず直感的にDatabaseを使用できるというもの
以前からそれ系のライブラリはあったみたいだけどやっぱり公式だよねというところで導入してみたがクッソ時間掛かったのでブログにしてみました
STEP1 Migrate to AndroidX
RoomはTargetSDKが28以上のAndroidX環境で動作するということでまずはこれが必要
自分はこれにめちゃくちゃ時間がかかり、どこでひっかかったのかわからないけどRebuildができない
RoomのimplementationもまとめてやったのがダメだったのかDuplicationのエラーが発生しまくって結局二回やった 何かを追加する前にClean→Rebuildする癖がつきましたね
どうでもいいですがMigrateと聞くとメキシコからアメリカに移住しようとする人々を連想します
あの人らどうなっちゃうんでしょね・・・ メシとか風呂とかどうしてんのかな
素人がAndroidXを解説するのもあれなのでQitaから拾ってきました
https://qiita.com/ikemura23/items/70aeb3f83d17b5d8f729
STEP2 Roomの導入
gradle(app)
これに関してはあまり日本語のHowToがなく公式を見ながらやったので間違えている箇所もあるかも
https://developer.android.com/training/data-storage/room/
Entities
まずはEntitiyを作る ようはTable定義相当なのかな?
よくあるサンプルみたいにUserID<int>とかじゃないから見づらいかもで申し訳ない
DataStore.java
Data Access Objects
次にDAO(Interface) これが直感的で使いやすいと感じた
Entityを参照してSQLを書いていきます
今思ったけどInnnerJoinとかするときどう書くのかな・・・ 機会があればまたブログにしよう
DataStoreDAO.java
Room Database
最後にDatabase Entityが増えたときは順次追加かな
公式にあるTutrialはここで終了 不親切な気がするけど最小構成ってとこなんですかね
あとは好きにしろみたいな
AppDatabase.java
STEP3 実践
まずはDBを作成する必要がありますね
通常の流れがわからないけどApplicationを定義してonCreateに書く感じでしょうか
(Manifestの編集も)
MyApp.java
Roomはメインスレッド上では使えないようになってるので、
普通に使ってみようと思うとエラーに遭遇すると思います
メインスレッドでOKという場合は.allowMainThreadQueries() オプションを書くといいみたい
メインスレッドじゃないということはAsyncTaskかなと思いWrapperのWrapperを作成することに
冗長なのが嫌だと言いながら冗長な気がするけどデータセーフなのでよしとします
RoomAsyncWrapper.java
Insert/Select/DeleteとDAOに対応するAsyncTaskを書きましたが
やることは同じでDAOを宣言して定義済みのMethodをdoInBackgroundで投げてます
適当なActivityを用意してテストデータを流してみたところいい感じに想定通り動いてくれました
ちょーっと準備が面倒すぎたけど一度導入してしまえば以降のプロジェクトでも使いたいと思えるはず
なんといっても通常の流れのSQLite3はもう使いたくない!












