スマホアプリ開発つまずきポイント:Realmデータベースの使い方~金宏和實「作ればわかる!Androidプログラミング」

  金宏和實著「作ればわかる!Androidプログラミング」で、スマーホアプリを勉強中です。最新版で対応していない部分について、修正方法を記します。
 今回は、第10章で発生した、Realmsデータベースに関わる不具合です。

 ※使用環境:2021年12月時点(Android Studio Arctic Fox 2020.3.1 Patch 4)
20211216z10r999.jpg


★Kotlinバージョンアップで、プログラムが動かない!
スマホアプリの作成に挑戦中です。以下の書籍に沿って、学んでいます(購入時の記事は、→こちら)。
・金宏和實著:作ればわかる!Androidプログラミング・Kotlin対応~10の実践サンプルで学ぶAndroidアプリ開発入門、2019/6、翔泳社
20211209za01.jpg

 開発環境の導入から、プログラミング、実機への導入まで、ひととおりの手順が書かれていて、とても分かりやすく実用的な書籍です。ただ、残念なことに、一部のソースコードが、そのままでは動きません。2019年6月の発刊であり、現在までに開発言語「Kotlin(コトリン)」が何度もバージョンアップされていることが原因です。

 2021年12月時点の環境(Android Studio Arctic Fox 2020.3.1 Patch 4)で動作するように、修正をしながら試しています。解決した部分は、当ブログに書きます。同様のエラーでお困りの方に、お役に立てば幸いです。(勉強中の人が書いています。ご指摘などありましたら、ぜひコメントください。)


★第10章:RecycleViewとRealm ~後編~

◎不具合発生箇所
・対象コード:第10章 各コード

◎発生状況
・エディタで作成時、数か所にエラーが指摘される。
・ビルドのとき、数個のエラーが発生する。
・実機で起動しても、データが表示されない。
・実機でデータを登録しようとすると、強制終了する。

◎原因
・バージョンアップによる仕様変更が原因と推察。

◎対策
 以下3カテゴリの修正が必要です。
1)レイアウトに関する修正
2)RecyclerViewに関する修正
3)Realmに関する修正

 前回は1)~2)を修正しました。今回は3)の修正内容を示します。

 前回の記事は→こちら


3)Realm
 Realmの実装に関しては、以下2カテゴリの修正が必要です。
①build.gradleのdependenciesおよびplugin
②Realm初期設定

◎gradleファイル
 まず、①です。テキストp.277の「build.gradle(Project:)」について、以下の内容に修正します。

classpath "io.realm:realm-gradle-plugin:10.9.0"

20211216z10r102.jpg

 続いてp.278「build.gradle(Module:app)」です。「plugins」で囲われた部分に、以下を記載します。テキストとは、プラグインの記載書式が異なっています。
id 'kotlin-kapt'
id 'realm-android'

20211216z10r111.jpg

 同「build.gradle(Module:app)」の「dependencies」は、以下記載に変えます。
implementation 'io.realm:android-adapters:4.0.0'

20211216z10r112a.jpg  

 なお、これらの参照物は、頻繁に更新がされているようです。もし、古いバージョン番号を入力すると、ハイライトされて最新バージョンを教えてくれます。このようなときは、最新の数字に書き換えます。
20211216z10r113.jpg


◎CustomApplication
 これで最後の修正です。Realmsの初期化をする「CustomApplication.kt」(テキストp.281)を、以下のように書き換えます。この設定がないと、EditActivityでデータを書き込む「realm.executeTransaction」のところで、実行時エラー(アプリが強制停止)になってしまいます。
val config=RealmConfiguration.Builder()
    .allowQueriesOnUiThread(true)
    .allowWritesOnUiThread(true)
    .build()

20211216z10r501.jpg

 上の設定について、補足です。Realmでは、UI(ユーザインターフェース。エディットボックスのある画面など)からデータを書き込むときは、通常は「realm.executeTransactionAsync」を使うことが推奨されているようです。「Async」は非同期の意味で、書き込みが終わるのを待たずに次の処理に進む、ということらしいです。これによって、ユーザがデータ書き込み待ちを意識しなくてよくなるメリットがあります。ただ、Asyncでの書き込みは、Realmを生成したのと同じスレッド(プロセスのこと?)でないと許容されないということです。今回Asyncを使ったところ、Realm作成元と異なるので実行不可というエラーが帰っていました。
 そこで、Asyncでない「realm.executeTransaction」を使います。ところが、Asyncなしのコマンドは、Realmデフォルト設定のままでは使用不可です。そこで、上のように「.allow...」として、クエリ(検索)実行と、データ書き込みを許容する必要があるわけです。


 これにて完動!
20211216z10r999.jpg

Comments

Popular posts from this blog

Privacy Policy: LifePointer - a life counter for TCGs

Privacy Policy: Absolute FFT - visualize frequency of sounds

Privacy Policy: Head or Tail? - An App for Tossing Coins