Androidで
ActiveRecordライクに
DBを扱う
@kurobara

1
アジェンダ
• ActiveAndroidとは
• インストール方法
• 設定
• モデル定義
• insert処理
• delete処理
• クエリ
2
こんなコード書きたいです?
•
•

コードに生のSQL処理
カーソルを使ってオブジェクトへのマッピング

3
ActiveAndroidとは
• Android向けのO/Rマッパー
• ActiveRecordモデルがベース
• 面倒なDBへのアクセスが容易になる
• 設定内容が非常にシンプル
• 現在も開発は継続中
• ドキュメントは少ない・・・
• https://github.com/pardom/ActiveAndroid
4
インストール方法
•
•

以下の手順でビルドします
ビルド後に、Andoridプロジェクトのビルドパ
スに追加します

$ git clone https://github.com/pardom/ActiveAndroid.git
$ cd ActiveAndroid
$ sh gradlew build

どちらか好きな方法で

$ mvn clean install
5
利用設定
• 以下の2種類の設定方法があります。
• AndroidManifest.xmlに記述
• コードで詳細設定を記述

6
AndroidManifestに記述
•

以下のような形でAndoroidManifest.xmlに記述します。

•

これがActiveAndroidにおける最低限の規約です。
初期化設定
DBとバージョン設定
a

7
詳細設定方法(1/3)
•

ソースコード上で設定する場合、以下を用意します

•
•

•

Applicationクラスを継承したクラス
AndroidManifest.xmlに上記クラスを指定

既存のコード(既にアプリがある)でアプリケーション
クラスを継承している時の為に使用

•

ライブラリを作るとき等に使う場合に使用

8
詳細設定方法(2/3)
•

設定できる内容は、以下のものです。

•

データベース名

•

データベースバージョン

•

キャッシュサイズ(デフォルトは1KByte)

•

モデルに使うクラス指定

•

モデルの型情報をシリアライズするクラス指定

9
詳細設定方法(3/3)
•

以下のような感じで設定を実装します。

AtiveAndroidの設定
a

第2引数はログ

停止処理

10
モデル定義 (1/4)
•

RubyのActiveRecordのモデル定義

Rails3.x系の定義
validation有

Rails4.x系の定義

11
モデルの定義 (2/4)
•
•

ActiveAndroidのモデル定義
他のORMにもあるようなアノテーションで設定
テーブル名の設定
Modelクラスの継承
対象カラム名と制約の設定

12
•

モデルの定義 (3/4)
アノテーションに設定できる内容

•
•

テーブル名とカラム名が必須項目
http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html

13
モデルの定義 (4/4)
•
•

Hogeが1に対してItemが複数の関連がある場合
Hoge側にヘルパーメソッドを定義

外部キーのカラム名

14
insert処理 (1/3)
•

ActiveRecordのコード

•

•

インスタンスを用意し、値を設定、最後にsaveメソッドを実行

実行されるSQL

15
insert処理 (2/3)
•

ActiveAndroidのコード

•

ActiveRecordと同じコードが書ける

•

•

アクセッサ次第だが・・・

実行されるSQL(ActiveRecordと同じ)

16
insert処理 (3/3)
•

トランザクションとバルクインサート

•
•

トランザクション中に複数回、saveメソッドを実行すればよい
rollbackについてはモデルにて定義しておくこと
トランザクション
開始

トランザクション
成功

トランザクション
終了

17
delete処理 (1/4)
•

delete処理は3種類

•

オブジェクトをロードしてから削除する方法

•

静的メソッドを使用して削除する方法

•

クエリを組み立てて削除する方法

18
delete処理 (2/4)
•

オブジェクトをロードしてから削除する方法

•

主キーを指定することでitemオブジェクトを取得できる

•

modelクラスが持つdeleteメソッドで削除実施

19
delete処理 (3/4)
•

静的メソッドを使用して削除する方法

•

対象テーブルと主キーが分かってる場合、一番便利

•

前ページのような無駄なselectクエリを発行しなくて済む

20
delete処理 (4/4)
•

クエリを組み立てて削除する方法

•

複数の行データを削除できる

•

直感的に使えるので、扱いやすい

•

扱い易い反面、プレースホルダが面倒・・・

21
クエリ (1/3)
•

ActiveAndroidの検索クエリ

•

•

直感的にSQLを書くような形で使用できる

(参考) s2jdbcのクエリ

•

s2jdbcの使用経験があれば、理解しやすい

22
クエリ (2/3)
•

where句を付け、idでソートする

•

where句はメソッドチェーンにはできないことに注意

•

offsetとlimitをつけることもできる

•

groupByやhavingを使うこともできる

23
クエリ (3/3)
•

テーブル結合を行うようなクエリは注意

•
•
•

クエリ生成は、ActiveAndroidで実施
クエリ実行結果を自分でcursor操作する必要がある
静的型付け言語故、結果のカラムが変わる場合に対応しきれない

•

別々のテーブルにクエリ投げてから、コード上でjoin出来なくもないけど・・・

24
まとめ
• ActiveRecordライクなので、扱い易い
•

s2jdbcの使用経験があれば学習コストは低い
と言えそう

• Modelクラスを継承したクラスを作るだ
けで、面倒な処理を大幅に軽減できる
• 一方で、以下の点に注意
• テーブル定義にコードが引きづられや
すくなること
• 複雑なクエリの場合、手間がかかる
25

AndroidでActiveRecordライクにDBを使う