iOS開発者のAndroid開発入門その10(ライブラリ〜ライブラリをすすめたい〜)

botman3 Android

はじめに

iOS みたいに Android のおすすめライブラリを紹介したいと思います。しかし、iOSと違って Android は実践したことはないです。。。(たぶんこれいいんじゃないかなぁ?って感じで書いてます)

リソース管理とリントツールは iOS では書いてましたが Android は標準のやつでいいと思います。

リソース管理

ビルド時に aapt ツールが R クラスを自動で生成してくれるためリソース管理はこの標準のやつでいいと思います。(R.swift みたいなもんだと思えば)
詳細は下記
Android デベロッパー:リソースへのアクセス

リントツール

Android Studio 標準の [Analyze] > [Inspect Code] でいいと思います。
使い方詳細は下記
Android Studioには標準のやつ

こういうのもあるみたいです。detekt/detekt

oss-licenses-plugin(v0.10.2)

oss-licenses-plugin
ライブラリを使うとどうしてもしないといけないのがライセンス表示!!ライセンス表示をサクッとやってくれるのが oss-licenses-plugin !!

使い方は簡単

  1. プロジェクトの build.gradle に追加
  2. モジュールの build.gradle に追加
  3. Activity 表示

これだけ!!

1. プロジェクトの build.gradle に下記追加

2. モジュールの build.gradle に追加

3. Activity 表示

こんな感じで表示される

一覧 ライセンス
list license

なんかめっちゃ細かく表示されるけどないよりはいいはず(たぶん)

詳細は下記参考

他にもライセンス表示できるライブラリは色々あるみたいです

JakeWharton/timber(4.7.1)

JakeWharton/timber
ログ出力のためのやつ。ログ出力は標準のやつを使えばいいけどこれをそのまま使うとリリースビルド時もログ出力されるのでそのへんを簡単に制御するために使います。

使い方は簡単

1. モジュールの build.gradle に追加

モジュールの build.gradle に下記追加

2. Treeの設定

Application クラスの onCreate などで下記設定を行う。これでDebugビルド時のみログ出力される

Application クラスを追加する場合はマニフェストに下記を追記する。

3. ログ出力

使い方は表示の Log と同じ。tag を付けなくてもいいので楽!!

こんな感じで出力される

タグを設定しない場合はクラス名とメソッド名がタグになるみたいです。

square/retrofi(2.9.0)

square/retrofit
通信するならこれ!

使い方は基本的にこの記事 Android Retrofit2 with Kotlin に丁寧に書かれていました。

  1. モジュールの build.gradle に追加
  2. HTTP API の interface 定義
  3. 呼び出し処理

1. モジュールの build.gradle に追加

コンバーターは GSON 以外も色々あるみたいです。(GSON は Swift でいう Codable のようなものです)

  • Gson: com.squareup.retrofit2:converter-gson
  • Jackson: com.squareup.retrofit2:converter-jackson
  • Moshi: com.squareup.retrofit2:converter-moshi
  • Protobuf: com.squareup.retrofit2:converter-protobuf
  • Wire: com.squareup.retrofit2:converter-wire
  • Simple XML: com.squareup.retrofit2:converter-simplexml
  • JAXB: com.squareup.retrofit2:converter-jaxb
  • Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars

2. HTTP API の interface 定義

一番単純な設定が下記。これで指定して Retrofit インスタンス生成時に指定した baseURL に対して user/list の GET 通信を行うことができます。

クエリ設定

アノテーションを使ってパスとクエリを下記のように指定することもできる。@Query は自動でエンコードされる(。。。たぶん)

POST

POST する場合は @POST アノテーションを使う。@Body アノテーションは Retrofit インスタンス生成時に指定した addConverterFactory に適したやつで変換してくれる。
変換したくない場合は @RequestBody アノテーションを指定する。

他にも @FormUrlEncoded, @Field, @Multipart アノテーションとかがあるみたいです。

ヘッダー設定

@Headers アノテーションを利用すればヘッダーの設定もできる

動的に設定する場合は下記

3. 呼び出し処理

単純に呼び出し処理を書くとこんな感じ

これをもうちょっと使いやすくしたい。。。

参考

Room(2.2.5)

Android JetPack にある Room
DBならこれ!!もしくは iOS と合わせて Realm でもいいかもしれない。

  1. モジュールの build.gradle に追加
  2. Entity定義
  3. Dao定義
  4. RoomDatabaseクラス定義

各コンポーネントはこんな感じ

コンポーネント 説明
Entity DBのテーブルを表すクラス
Dao DBのデータ操作を行うクラス
RoomDatabase DAOを生成するクラス

room_architecture
引用:Android デベロッパー:Room を使用してローカル データベースにデータを保存する

1. モジュールの build.gradle に追加

他にもこんなのがあるらしいけど今回は割愛

2. Entity定義

Entity が DB のテーブルに相当する。定義は下記のように @Entity アノテーションをつける。

@Entity は少なくとも1つの主キーが必要であり単純なものは上記のような実装になる。DB のテーブル名はそのままクラス名になりカラム名はフィールド名になる。

テーブル

テーブル名をクラス名と別にしたい場合は下記のように tableName プロパティを利用する。(SQLite のテーブル名は大文字小文字の区別はないらしいです)

@Entity には tableName プロパティ以外にも foreignKeys, ignoredColumns, indices, inheritSuperIndices, primaryKeys があるみたいです。

詳細は下記
Android デベロッパー:Entity

主キー

主キーを自動生成したい場合は下記のようにできる

複合主キーの場合は下記のようにする

カラム

カラム名をフィールド名と別で付けたい場合は @ColumnInfo アノテーションを利用する。

DB に特定フィールドを保存したくない場合は @Ignore を利用する。

@ColumnInfo には name 以外にも collate, defaultValue, index, typeAffinity があるみたいです。

詳細は下記
Android デベロッパー:ColumnInfo

埋め込みオブジェクト

@Embedded を利用すればオブジェクトの埋め込みができる。下記のように User を定義すると DB の user テーブルには id、firstName、street、state、city、post_code というカラムができる。

同じ型で2つ以上埋め込む場合は @Embedded(prefix = "loc_") のようにプレフィックス設定で複数埋め込みも可能らしい。

1対1のリレーション

User と Library に1対 1のリレーションがある場合下記のように UserLibrary を定義し @Relation を使って UserAndLibrary を定義する。

データ取得は @Transaction を使い Dao に追加する

1対多のリレーション/多対多のリレーション

1対多のリレーションの場合は下記のように定義する。

多対多のリレーションの場合は下記のように定義する。

リレーションの詳細は下記参考
Android デベロッパー:オブジェクト間のリレーションを定義する

ビューの作成

Room ではビューも使えるらしい。下記のように @DatabaseView アノテーションを使う。

DB に関連付けるため RoomDatabaseviews プロパティを追加する

@DatabaseView には value, viewName プロパティがあるみたいです。

詳細は下記
Android デベロッパー:DatabaseView

3. Dao定義

DB へのアクセスはすべて Dao (Data access objects) を使用する。Dao は下記のようにインターフェースにアノテーションを付けて実装してやると Room が自動で処理を実装してくれるみたいです。

挿入

データ挿入には @Insert アノテーションを利用する。

データを挿入すると rowId を返却することもできる。データが1つの場合は Long が返却され、複数挿入の場合は List<Long> で返却される。

挿入データがコンフリクトした場合の設定は onConflict プロパティで設定できる。下記3種類。

  • OnConflictStrategy.ABORT
    デフォルトの設定。ロールバックする。
  • OnConflictStrategy.REPLACE
    新規データと入れ替える。
  • OnConflictStrategy.IGNORE
    既存データを残す。

entity プロパティもあるみたいだけど使い道がよくわからない。。。

更新

データ更新には @Update アノテーションを利用する。Entity の主キーをみて値が更新される。

更新された行数を Int で返すこともできるようです。Insert 同様 onConflictentity プロパティが設定できるようです。

削除

データ削除には @Delete アノテーションを利用する。Entity の主キーをみて値が削除される。

削除された行数を Int で返すこともできるようです。entity プロパティが設定できるようです。

クエリ

@Query アノテーションを使うと DB の読み書き処理ができます。クエリに問題がある場合はコンパイル時にエラーチェックされるので安心!

: minAge のように引数を渡すこともできる。

下記のようにすると特定カラムのみ返すこともできる。

4. RoomDatabaseクラス定義

EntityDao を定義した後は下記のように RoomDatabase を継承した抽象クラスを作成する。

@Database のプロパティには entities, exportSchema, version, views があるみたいです。

あとは下記のように Dao を生成して DB 操作を行う。

Room の処理は UI スレッドで呼んじゃダメらしいので Coroutines とか使わないといけないんだとか。(Coroutines についても調べないと。。。)

DBの中身を確認する

  1. [View] > [Tool Windows] > [Device File Explorer] から Device File Explorer を開く
  2. data > data > アプリ名 > databases を開く
  3. フォルダ内のdatabase_name, database_name-shm, database_name-wal を選択
  4. 右クリックのSave As... で PC に保存する

あとはターミナルで sqlite コマンドを使うか DB Browser for SQLite で開く

参考

Dagger(2.28.3)

google/dagger
DI 用!! Dagger2 と呼ばれてるやつらしい。元々 Square 社が開発してたのを Google が fork して開発してるらしい。(参考:Dagger Android Hiltが神

鋭意作成中。。。わからなすぎて草

参考

おまけ〜build.gradleのバージョン指定〜

ライブラリのバージョンは特に何も考えずにこんな感じで書いてました

別にこの書き方でもいいですがいい書き方を見つけたのでそれを採用したいと思います。

プロジェクトの build,gradle にバージョンはまとめます!

モジュールの build,gradle はこんな感じ!一箇所にまとまってるのでスッキリした気がする。(buildConfig もいるかはわからないけどとりあえずこれでいきます)

参考:あなたの build.gradle バージョン記述、きもいです。

おわりに

iOS と違って Carthage, CocoaPods, Swift Package Manager とか混在しないのはいい!!

とりあえず iOS 参考に同じような機能のライブラリを書いてみたけど Android の開発経験があまりないのでまたのちのち更新するかも。

他に気になったライブラリ

コメント

タイトルとURLをコピーしました