どろあそび (6)

「Android Kotlinの基礎]もレッスン6まできました。

レッスン6はデータベースへのアクセスを提供するRoomデータベースライブラリと、スレッド (軽量プロセス) を容易に扱えるようにするコルーチンを扱っています。

レッスン6のサンプルプログラムには若干の問題があり、現行のAndroid Studio (Arctic Fox | 2020.3.1) では正常にレッスンを進めることができませんでした。

bulid.gradleが参照しているライブラリのバージョンを最新のものに変更するとともにandroid.arch.navigationライブラリへの参照をandroidx.navigationライブラリに変更することで動作するようになりました。

最初の項目「Create a Room Database」はRoomデータベースライブラリを使用したデータベースアクセスの方法とJUnitによるデバッグ手順を扱っています。

Roomデータベースライブラリを使用したデータベースアクセスではまずデータベースレコード (Entity) に対応したデータクラスを作成します。

次にデータベースとのインターフェースとなるデータアクセスオブジェクト (DAO) をインターフェースとして実装します。データベースへの登録 (insert) およびレコードの更新 (update)、単一レコードの削除 (delete) は対応する手続きを宣言するだけで済みますが、それ以外の操作は対応するSELECT文を指定する必要があるためSQLの知識は必須です。

最後にデータベースにアクセスするオブジェクトを生成するクラスを準備します。データベースには単一のオブジェクトを通してアクセスする必要があるため、インスタンスを生成できない抽象クラスとして定義し、getInstance手続きを通してオブジェクトの生成を管理する構成としています。

Roomデータベースライブラリを使用する際の手順はほぼ変わらないので、この項目で案内されている手順をテンプレートとして使用できるとのことです。

また、JUnitを使用したデータベースのテスト方法もこの項目で扱っています。ただしこの項目で説明されているテストの方法ではコルーチンに対応したデータベースはテストできないため、データベースのテストを十分に行ったうえでコルーチンへの対応を行う必要がありそうです。

2番目の項目「Coroutines and Room」はコルーチンを使用した非同期操作を扱います。

データベースアクセスは操作によっては非常に時間がかかる場合があり、そのような操作を指示するとデバイスもしくはアプリがハングアップしたような状態になってしまいます。

これを避けるため、データベースアクセスやネットワークアクセスなど時間がかかる処理を行う場合はスレッドを使用した非同期処理を行うことがあります。

コルーチンはスレッドを使用した非同期処理を容易に実装するための機能で、実装の詳細を調べていないので詳しいことはわかりませんが、非同期処理を逐次動作のように記述できるようにするものだそうです。

非同期処理が必要となる手続きにはsuspendのキーワードを付けて時間がかかる可能性がある手続きであることを明示します。この例ではDAOのLiveDataを返すものを除く各手続にsuspendキーワードを付しています。

次にこれらの手続き (suspendキーワードを付けなかったLiveDataを返す手続きも含め) を呼び出すビューモデル側で呼び出し手続きをviewModelScope.launceの引数として実行します。推測ですが、viewModelScope.launchでスレッドを生成してそのスレッドでsuspendを含む手続きを実行しているように思われ、結果をLiveDataとしてフラグメントに返すことで非同期実行をイベント駆動型のUI処理に統合しているように見えます。

3番目の項目「Use LiveData to control button states」はフラグメント間のナビゲーションとUI項目の動的な表示・非表示を扱っています。

内容的には特に目新しいところはないのですが、前の項目で作成したビューモデルがAndrodViewModelクラスから派生しているのに対して、この項目で作成するビューモデルはViewModelクラスから派生している点、変えている理由が実はわかっておらず、調べる必要がありそうです。

また、この項目の「4. Task: Record the sleep quality」で使用されている「SleepQualityFragmentDirections」というオブジェクトが解決できなかったというのが最初に書いた問題点になります。このオブジェクトはナビゲーションファイルに基づいて開発環境が自動的に作成するオブジェクトですので、ビルドファイルで指定されているライブラリの不整合が問題の要因になっていたのだろうと考えています。

詳細不明な点がいくつか残っているので、永続的データを使用するアプリを作成する際には少し詳しく調べた方がよさそうだというのが感想です。


bewise.jp

Be Wise: 賢くなろうということ

0コメント

  • 1000 / 1000