ラベル Room の投稿を表示しています。 すべての投稿を表示
ラベル Room の投稿を表示しています。 すべての投稿を表示

2022年10月3日月曜日

まだRoomでデータ操作ができていません

Roomの事を知るにつれて、Roomカバーしている(しようとしている)範疇は結構大きいことにため息しか出ません。

言葉の定義もわざと独自性をだしているのか、自動翻訳に頼っているためなのか分かりませんが、結局これってあれの事だよね的なことなのですが、そうは言ってもAndroidアプリだとこの機能もいるよね、とかそんな感じ。しかもなんか自動的に用意してくれ「そう」な感じはするものの、ほんとに任せて大丈夫なの?とか。

実際問題としてローカルはSQLite3のサンプルしかないわけで、じゃあ実際に別のデータベースに直接アクセスできるの?とかいまだに疑問だったりしています。

そうこうしていると、段々と切実な問題が。AndroidのコンポーネントというかクラスってAndroidが都合の良いように作られていてアプリの都合はお構いなしなのが災いしているのか、Viewの構築の手法もViewModelを組み込んでどうのこうのとかあるようで…今までそういうのは避けてきたわけですが、やはりメインストリームもその辺を何とかする必要があると思った結果なのかもろもろがJetPackと呼ばれているものなのかな?と。

で、どうしてもデータベースアクセスが前提となるとViewModelを使うべきなのはわかりました。が、ViewModel自体は副産物の様で、実際はAndroidのインスタンスのライフサイクルにテコ入れしてもう少し切り離されたものを実装した結果、ViewModelというものが必要になった感じです。

これを使えば、無駄にApplicationクラスを肥大化させることなくアプリレベルのグローバルな単一のしかも安全なライフサイクルを持ったクラスが存在できるようになります。

良くも悪くもというか悪事なことですが、極論を言ってしまえばApplicationクラスを肥大化させることでかなり自由にアプリは作れます。しかしAndroid自体はそういうことを激しく拒絶しています。そもそも論として各クラスはそれなりに存在することが良しとされる世界。しかもできるだけクラスは小さく、かつ相互依存は極力避けることが望ましい。

なのでApplicationクラスにアプリ自体の機能を持つことなど言語道断と言うことですw

そしてRoomもそうなのですがViewModelをさわるとjavaだけで書こうとすると足かせにしかならず、自ずとkotlinで書くしかないかなと感じるわけで…いままでkotlinで作った方が楽になりそうだな?とかそんな感じだったのですが、ここまでくるとjavaで書こうとするとなんかえらい大変じゃない?とかなってしまいました。そしてkotlinの壁と言うわけです。lazyって何?とかもう壁しか見えませんw

2022年9月28日水曜日

Roomで(使う前に)ハマったポイント

データベース操作をするならこれからはRoomを使うのが当たり前みたいな流れなので試してみました。

が、これがもうデータ操作をする前の準備段階で結構痛い目を見ています。

参考にできそうな情報が過去と錯綜しているのと、プレビュー段階の物とか。あと、Googleのドキュメントが結構嘘っぱちすぎて辛いです。

2022/09/28現在、Roomのステーブルバージョンは 2.4.3

この状態で日本語のドキュメントと英語のドキュメントのサンプルコードの差異はほぼない感じ。

で す が

このサンプルがかなりあてにならない。

プロジェクトへの導入部分のコードが誤っているとか何というか…モジュールレベルのbuild.gradleへ追記する必要のある定義で問題

その1kspはなかったことにしよう

dependencies {
    def room_version = "2.4.3"

    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"

    // To use Kotlin annotation processing tool (kapt)
    kapt "androidx.room:room-compiler:$room_version"
    // To use Kotlin Symbol Processing (KSP)
    ksp "androidx.room:room-compiler:$room_version"

    // optional - RxJava2 support for Room
    implementation "androidx.room:room-rxjava2:$room_version"

    // optional - RxJava3 support for Room
    implementation "androidx.room:room-rxjava3:$room_version"

    // optional - Guava support for Room, including Optional and ListenableFuture
    implementation "androidx.room:room-guava:$room_version"

    // optional - Test helpers
    testImplementation "androidx.room:room-testing:$room_version"

    // optional - Paging 3 Integration
    implementation "androidx.room:room-paging:2.5.0-alpha03"
}

誤りと言うのは何ともな部分ですが、「ksp "androidx.room:room-compiler:$room_version"」をコメントアウトしないと先に進まない。コメントアウトしても問題が無いのかという判断もできない状態でコメントアウトするのはかなりきつかった。色々見る限り、コンパイル時間が短くなるだけのようなので、不安定になるぐらいならこんなものいらない。ステーブルバージョンとはいったい何なのかと…

その2「implementation "androidx.room:room-paging:2.5.0-alpha03"」

結論から言えば、これが大問題で、バージョンは他と合わせる必要がありました。

なので implementation "androidx.room:room-paging:$room_version" とすれば解決できます。そもそもオプショナルってなっているのでこれもコメントアウトするだけでもいいのかもしれませんが不明。

ちなみに2.5.0-alpha03は現時点でアルファリリース状態のバージョン。

しかもです。こいつが2.5.0ベースのおかげで、SDKレベルも33以上にする必要が出て来てたりこれのおかげでえらい遠回りさせられました。

@ナントかで記述して作法通りに記述する必要があり、いくつかのデータベースプログラミング経験があってもマニュアルがないときつい気がしました。ネット上で探すとそれなりに時間を浪費する。そしてエラーが表示されても文字化けして想像を絶するという。

この文字化けは Android StudioにおけるBuild Outputの文字化けを解消 https://qiita.com/watanaby0/items/bc2459e03c81a4b708c7 で解決できました。Room以外にもたびたび悩まされた文字化けですが、Roomで発生するエラーはコード展開されたあとのコンパイラのエラーなので全く想像つきませんでした。出力は英語のままでもいいのに変なところでローカル化するから…

で表示されたエラーが「(public)より弱いアクセス権限を割り当てようとしました」という感じで、これの英語表記は多分「attempting to assign weaker access privileges; was public」となっていて、これをヒントに検索してみたところ、2.3ベースにすれば解決するっぽい記述が出てたので変更しても変化せず。

悩んだ挙句に「room-paging:2.5.0-alpha03」が原因じゃないかと当たりを付けたところようやく解決したという。

こう言うのがandorid触ってて非常に面倒くさい。windowsも似たようなことはあるのですが、環境設定レベルで動かせないとか知らない人間にとってものすごいハードルが高い気がします。