このページを正しく表示するにはJavascriptを有効にしてください。
アノテーションを最大活用してAndroidのJSON、DB連携を加速する
## よくあるパターン
* APIを叩きJSONを取得
* JSONをパースしてオブジェクト化
* オブジェクトをDBに保存
* DBからデータを取り出してカスタムリストに表示
こういう流れってAPIを使ったアプリ開発しているとよく出てきますよね。
でも実際やろうとすると似たような変数を何度も書くことになりうんざりしてきます。
そこで今回はアノテーションを活用して開発を加速する方法を紹介します。
## 普通にやると
JSONのパース時にJSONのキーとオブジェクトのプロパティのマッチング
オブジェクトとDBのカラム名とのマッチング
オブジェクトとリストとのマッチング
何回も似たような付きあわせを自分で書かなくてはならないです。
JSONのキーが数個なら我慢できますが、
何十個もパラメータがある場合、いちいち突き合わせの処理を書くのは大変です。
## アノテーションを使ってみる
そこでアノテーションライブラリの登場です。
### アノテーションとは
@をつけるだけでコンパイラによる自動コード挿入などが可能な機能です。
詳細は省きます。
### 使うアノテーションライブラリ
ActiveAndroid (DBとObjectを付きあわせ)
JsonPullParser (JSONとObjectを付きあわせ)
lombok (Setter、Getterの自動化)
(AndroidAnotationも使えそう)
### 使い方
#### インストール
ここも説明は省きます。
最初厄介ですが、一度セットアップしてしまえば次の開発からは楽に使えます。
#### モデルの作成
では早速オブジェクトのモデルを作ってみましょう。
:::java :HogeModel.java
@Table(name = "message") // ActiveAndroid
@JsonModel(decamelize=true) // JsonPullParser
@Data // lomok
public class MessageModel extends Model {
@JsonKey
@Column(name = "message")
private String message = "";
@JsonKey
@Column(name = "status")
private int status = 1;
@Column(name = "created_at")
private Date created_at = new Date(System.currentTimeMillis());;
}
こんな感じでモデルを定義します。
アットマークがところどころについてゴテゴテしていますが、
これのお陰で劇的にコード量を削減できます。
モデルの上に付いているアノテーションについて簡単に説明します。
```@Table``` はこのモデルとデータベースを対応付けるアノテーションです。
対応付けるテーブル名も引数で指定できます。
テーブル作成もActiveAndroidが面倒みてくれるので手間いらずです。
```@JsonModel``` はこれがJSONの構造であることを示してます。
decamelizeを有効にするとJSONのキー名をキャメルケースの変数に対応づけてくれます。
```@Data```はLombok用のアノテーションです。
これはシンプルなGetter/Setterを作成してくれます。
JsonPullParserを使う時はGetter/Setterが必須なので、
このLombokを使うと楽ができます。
もちろん自分でSetterを実装したい時はオーバーライドすればOKです。
つぎにメンバに使うアノテーションについても簡単に。
```JsonKey```はこのキーがJSONにある事を示すアノテーションです。
該当するJSONキーが無くても問題無いです。
#### 使い方
String jsonには
:::json
{
"message": "Hello World!",
"status" : 1,
}
が入っていることにします。
こんなJSONを返すAPIないと思いますが簡単のため。
で、
:::java
MessageModel message = MessageModelGen.get(json);
message.save();
これをすると、もうDatabaseにはMessageのレコードが保存されてます。
またmessageインスタンスをViewなどに渡したりしてお好みに使えます。
ここまでいくともはや魔法ですね。
ちなみにここで出てくる'''MessageModelGen'''は
JsonPullParserによって自動生成されたクラスです。
#### 複雑なJSON
この例は極端に簡単な例でしたが、キーの中に配列になっていたりする
複雑なJSONにももちろん対応できます。
:::json
{
"messages": [
{"message": "hello", "status": 1},
{"message": "world", "status": 0},
],
"success" : 1,
}
みたいに、先ほどのMessageが配列になり、それがAPIの基本構造に組み込まれている場合、
:::java
@JsonModel(decamelize=true) // JsonPullParser
@Data // lomok
public class ApiStatus extends Model {
@JsonKey
private int status;
@JsonKey
private List
messages;
}
のような形でAPIの受け皿を作ってあげればOKです。
パースが完了すると messagesのリストに1つづつ格納されています。
このへんはJSONPullParserの仕様を調べてみてください。
是非アノテーションを活用して快適なAndroid開発を!!