天下一「AndroidのORM」武道会(2015) スペックシート
 Share
The version of the browser you are using is no longer supported. Please upgrade to a supported browser.Dismiss

 
View only
 
 
Still loading...
ABCDEFGHIJKLMNOPQRSTUVWXYZAA
1
2015/12/06ORMLitegreenDAOActiveAndroidOllieSugarORMDBFlowDBToolsShillelaghTorchCupboardSlim RepoRushOrmSquiDBOrmaEasyliteORMTriOrmQuantumFluxCPOrmRealmSnappyDBMapDBPaperSabrescouchbase lite
2
ジャンル古参ORM古参ORM古参ORM中堅クラス中堅クラス中堅クラス中堅クラス中堅クラス中堅クラス中堅クラス期待の新星期待の新星期待の新星期待の新星期待の新星期待の新星期待の新星期待の新星NoSQL枠NoSQL枠NoSQL枠NoSQL枠NoSQL枠NoSQL枠
3
URLhttp://ormlite.com/http://greendao-orm.com/http://www.activeandroid.com/http://satyan.github.io/sugar/http://andrewreitz.com/shillelagh/http://www.rushorm.com/http://realm.io/http://www.snappydb.com/http://www.mapdb.org/http://developer.couchbase.com/mobile/develop/guides/couchbase-lite/index.html
4
Source Repo URLhttps://github.com/j256/ormlite-core
https://github.com/j256/ormlite-android
https://github.com/greenrobot/greenDAOhttps://github.com/pardom/ActiveAndroidhttps://github.com/pardom/ollie/https://github.com/satyan/sugarhttps://github.com/Raizlabs/DBFlowhttps://github.com/jeffdcamp/dbtools-androidhttps://github.com/pieces029/shillelaghhttps://github.com/brightify/torchhttps://bitbucket.org/littlerobots/cupboardhttps://github.com/slim-gears/slimrepohttps://github.com/Stuart-campbell/RushOrmhttps://github.com/yahoo/squidbhttps://github.com/gfx/Android-Ormahttps://github.com/mdennis10/EasyLite-Ormhttps://github.com/HendrixString/Android-TriOrmhttps://github.com/himanshu-soni/QuantumFluxhttps://github.com/Wackymax/CPOrmhttps://github.com/realm/realm-javahttps://github.com/nhachicha/SnappyDBhttps://github.com/jankotek/mapdbhttps://github.com/pilgr/Paperhttps://github.com/tamir7/Sabreshttps://github.com/couchbase/couchbase-lite-android
5
min API Level? (4で動作報告あり)>= 4??>= 4>= 4?>= 15?>= 7>= 10>= 4?>= 15?>= 12>= 9>= 9>= 9>= 8>= 9>= 9
6
ライセンスISC License
DaoCoreはApache License 2.0
DaoGenerator, DaoTestはGPL v3
Apache License 2.0Apache License 2.0MIT LicenseMIT LicenseApache License 2.0Apache License 2.0MIT LicenseApache License 2.0Apache License 2.0Apache License 2.0Apache License 2.0MIT LicenseMIT LicenseApache License 2.0Apache License 2.0MIT LicenseApache License 2.0Apache License 2.0Apache License 2.0Apache License 2.0Apache License 2.0Apache License 2.0
7
versionName4.482.1.03.1.0-SNAPSHOT0.3.2-SNAPSHOT1.42.2.14.1.20.5.01.0.0-alpha.32.1.40.9.11.1.112.0.10.9.01.2.0-0.9.12.980.86.00.5.21.0.81.10.9.181.1.0
8
初版リリース日2010/01/082011/08/042010/10/252014/04/252011/08/122014/09/072013/04/252014/03/212013/08/252013/04/192015/03/302015/01/232015/04/162015/11/092015/01/072015/05/032015/08/072015/03/202012/07/042013/10/072012/08/182015/06/032015/05/032012/01/11
9
最新版リリース日2013/12/172015/11/122014/10/072015/03/032015/07/072015/07/042015/10/272014/12/012014/11/252015/10/052015/11/222015/10/152015/10/302015/12/052015/11/082015/11/172015/09/162015/10/272015/12/032015/06/102015/07/082015/11/272015/11/172015/05/30
10
11
GitHub::Starcore:227 / android: 6623423319939212451319254921-3214610092591754142856891169363224612
12
GitHub::Forkcore: 118 / android: 252132284128335182855-1119611230306129425491134
13
14
前評判AndroidのORMの祖といえる気がする。ORMながら柔軟にいじることができる。筆者の経験した案件ではormlite-androidをいじってsqlcipherに対応させていた。導入がめんどくさいイメージしかない。しかし競合の古参ORMより速い。国内では日本語訳記事等のおかげでユーザー数が多い印象がある。更新が途絶えており今後が心配。ActiveAndroidの作者が新しく作ったプロジェクト。ActiveAndroidと異なりコード生成でパフォーマンス向上を図っている個人的に使用しているORM。シンプルにしたActiveAndroidのような書き味。更新もそれなりに。自ら「based on Active Android, Schematic, Ollie, and Sprinkles」と言っており、今後大きく化ける可能性もあるので選出。→大きく化けたとの連絡があったXMLでモデル定義を行うORM。gradleで生成モデルの属性を指定できる。RxJavaも、この属性指定で対応可能README読む限りでは特に言及することのないORM特に言及することはないORM何気にandroid-aptの作者がメンテナンスしているORM。"The library was inspired by GreenDAO and Microsoft Entity Framework Code First"ということで早いのでは?という雑な感想"Why was RushOrm written?"を読んでいると、SQLレスでマイグレーションができると書いてある。これは新しいなぁ米Yahoo!が提供しているORM。gfxさんが作成したORM。
Perl界で便利ライブラリを作成してきた氏は混迷のORM界の覇者となるのか。
http://gfx.hatenablog.com/entry/2015/11/14/214559
特に言及することはない。。。それはそれとしてライブラリ名にEasyとかLightとか書いてあるやつは個人的にあんま良い印象がないJVM Serializationを使ったORMということで、ちょっと変わり種かもしれない。
GitHubのリポジトリにあるコードはそのままではビルドできなかったので、手元でディレクトリ構造をいじってaarを作成した。
CPOrmとSugarORMにインスパイアされたとか"A Powerful Content Provider ORM for android"とのことで、ContentProviderもORMも使えるような設計を意識しているようだ。AndroidのNoSQLデータベースの超新星。20kINSERT/minということでどのくらいぶっ飛んだことをしてくれるか期待する。前評判何書こうかなーと思って作者のTwitter見たらRealm社の人っぽくてビックリした。
このORM自体はありがちなNoSQL DBのインターフェースだなーと。
「MapDB is not a database, but an engine.」ということで厳密にはDBやORMではないのだけど、Android Arsenalに掲載されていたから使ってみるデータ構造の変更をうまくやってくれそうなことがREADMEに書いてあるParseライクなAPIを提供するORM。Parseと併用するなら便利か・・・?NoSQLではCouchbaseも有名。このモバイル版のポテンシャルはいかほどか。
15
16
1.インストール
17
maven centralにあるかYesYesNoYesYesNo *YesYesYesYesNoNoNoNoYesNoNoNoNoYesYesNoNoNo
18
bintray jcenterにあるか-No *No-NoYes----YesNoYesYes-NoYesYesYes--YesYesNo(独自提供のrepoアリ)
19
jarが提供されているか--Yes------------No-------Yes
20
provided指定を使用するかNoNoNoYesNoNoNoYesNoNoNoNoNoNoNoNoNoNoNoNoNoNoNoNo
21
android-aptを使用するかNoNoNoNoNoYesNoNoYesNoYesNoYesYesNoNoNoNoNoNoNoNoNoNo
22
ドキュメントの有無YesYesYesNoYesYesNoYesYesYesYesNoYesNoYesNoYesYesYesYesYesNoYesYes
23
感想ふつう。非常にセットアップがつらい。しかし一度やってしまえばなんとかなる。mavenにないのはgradle的に少しめんどくさく思う楽にできるかと思ったらまさかのドキュメントなしという状況であり、行く先が怪しくなってきた。AndroidStudio使っているならすぐに導入できる。ふつうだけどandroid-aptの導入の要点は知っておく必要がある。DBToolsのためにgradleに定義を書き足す必要があり極めて面倒。まぁ楽インストールはGitHubのMarkdownを読めば良いので実は楽。ふつう。資本が入っているためか非常にわかりやすかった。ふつう。独自のmavenリポジトリを指定するところが厳しいが、そのくらい。
24
備考・補足やはりわかりづらいセットアップなのだが、素晴らしい記事があるおかげで助かった。
https://github.com/SureCase/GreenDaoForAndroidStudio
しかしこのチュートリアルはコピペでやると動かないので対策書く
Contextをモックさせる入り口がないのでテストを書けない。除外。JVM SerializationベースContentProviderに依存したORMContentProviderに依存したORM。QuantumFluxの先輩と言えるKryoベースver.2がbeta版として絶賛開発中のようだKryoベース
25
26
2. セットアップ
27
ブートストラップの仕組み(Applicationに記述を足す/etc...)なし(適宜Helper/Managerを用意する)なし(自動生成されたDaoMasterからDaoSession/Daoクラスのインスタンスを生成する)AndroidManifestにDBバージョンとファイル名を定義する。
com.activeandroid.app.Application(を継承したクラス)をAndroidManifestに定義する。
もしくはActiveAndroid.initialize(this) と ActiveAndroid.dispose() を自分でApplicationクラスに定義する。
Ollie.init()するAndroidManifestにDBファイル名、バージョンなどを定義する。
com.orm.SugarApp(を継承したクラス)をAndroidManifestに定義する。
v1.3ではApplicationクラスにがっちり結びついているのでSugarAppクラスをつかうのはほぼ必須となっている。
v1.4ではいくぶんか改善されている。めでたく今年リリース。更新されるって素晴らしい。
DBFlowの提供するViewなどを使うときは不要 / FlowManager.init(Context), destroy() を使うなし(Managerクラスが自動生成されるので使う)SQLiteOpenHelperをextendしたものをShillelaghインスタンスに与える。
データベースの初期化はSQLiteOpenHelperが担う
TorchAndroidクラスにモデルから自動生成されたクラスを渡すことでセットアップするSQLiteOpenHelperを用意してCupboardに渡すか、Applicationクラスに定義する方法もある。
https://bitbucket.org/littlerobots/cupboard/wiki/RegisterEntities
データベースの初期化はSQLiteOpenHelperが担う
生成されたRepositoryServiceクラスを使うApplicationクラスに書き足すSquidDatabaseを継承したクラスを使うOrmaDatabaseをBuilderを使って作るTriDatabaseのBuilderをbuildするQuantumFlux.initialize()するApplicationクラスでCPOrm.initialize()するRealm.getInstance(this)を好きなところでDBFactory.open()でDBクラスのインスタンスを作るDBMakerにオプションを指定してmake()するPaper.init()SabresObject.registerSubclass()で使用するクラスを指定し、Sabres.initialize()する適宜ManagerとDatabaseを取得する
28
初期データ投入の可否/仕組みNoNoYes / assetsフォルダにAA_DB_NAMEと同じ名前のSQLiteファイルを置くNoassets/sugar_upgrades に <VERSION>.sql を置くapp/src/main/assets/ に置くNoNoNoNo / SQLiteOpenHelperでどうとでも。NoNoNoNoNoNoNoNoNoNoNoNoManager#replaceDatabase()を使うとできそう
29
感想モデル定義をAnnotationで書いてたら前世の記憶が蘇ってきてウッってなった自動生成されているコードをつかうので、ORMLiteのようにSQLiteOpenHelperを用意する必要はないWiki読み直してたらAA_MODELSとかあって、出来る限り高速化できるようになっているらしい。(まだStable版には入ってないと思う。)OllieはActiveAndroidの事前コード生成版だと思っている。
ActiveAndroidをやったことがあるなら割と同じなので楽かなDB単位でクラスを書くとAPTでなんかよしなにやってくれるのが特殊だと思ったとにかくモデル定義をXMLでやるということが受けつけない。つらい。ActiveAndroidっぽさはあるがSQLiteOpenHelperが必要なので、幅広くカバーしているわけじゃない。でも案外こういうほうが使いやすいかもしれない。生成されたクラスを渡すところが特殊だと感じたモデルに一切の手を加えずとも使うことが出来るのは凄いと思う。なんか頑張ろうとしているのは伝わるが、複雑すぎて無理。あとBooleanのConditionの制約が大きすぎる(null or not nullしか見れないってどういうことよ。。。)このあたりはActiveAndroidっぽい(テストを書く都合、本検証ではApplicationクラスの中は空っぽ)これはORMではないらしい。Cursorとかを楽に引っ張ってきて、自動生成されたObjectとのバインドを楽にしてくれる、というもの。Builderにあるメソッドを眺めると、どのスレッドでDB操作するかが指定できる等、色々と研究されているような気がするまぁ特筆すべき事は無いAndroidManifestでmetadata使ってるのにconfigファイルをJavaで書かせるのはちょっと謎SQLiteでやるDBより楽に書けている気がするんですがそれはメモリ空間上にのみDBを作成することが出来るなど、Android向けではないなーという感じがひしひしとまー楽ここまでは普通かな?ORMというよりはSQLiteの代替という感じのAPIセットなので、もうひとつラッパーライブラリがあれば捗りそう
30
31
3. 特記事項
32
マイグレーションについてSQLiteOpenHelper#onUpgrade()を使うDaoMaster.OpenHelperを継承したHelperクラスを作成し、onUpgrade()を実装する。(http://www.androidanalyse.com/greendao-schema-migration/)AA_DB_VERSIONをインクリメントすると、Modelクラスの追加を自動で行ってくれる。
もしModelのカラムが増減したときは assets/migrations に<NewVersion>.sql を置く
Migrationクラスを継承したクラスを作成しておき適宜書いておくと自動でやってくれそうassets/sugar_upgrades に <NewVersion>.sqlとか書けば行けそうな気がするBaseMigrationクラスを拡張する方法と、 /assets/migrations/{versionName.sql} を置く方法がある(https://github.com/agrosner/DBFlow/wiki/Migrations)?SQLiteOpenHelper#onUpgrade()を使って手動で対応する?SQLiteOpenHelper#onUpgrade()内で CupboardFactory.cupboard().withDatabase(db).upgradeTables() をすることでカラムやテーブルの追加がサポートされている?書き足したら勝手にやってくれるようだ。とはいえコンフリクトという概念がある。SquidDatabase#onUpgrade()を継承して行うだいたい勝手にやってくれるようだが、独自のマイグレーションエンジンを定義することも出来るJVMシリアライゼーションベースとのことで、カラムの追加はOKだが、変更と削除はNG出来ない気がする、ドキュメントやテストには見当たらなかった出来ない気がする、ドキュメントやテストには見当たらなかったRealmMigrationを拡張して実装する http://realm.io/docs/java/0.74.0/#migrationsこのような典型的なNoSQLの場合、どのように書くかでモデルの維持状況が変わってくる。オブジェクトを直接セーブすれば、Serializeの範囲でデータマイグレーション可能だし、メンバ変数をひとつずつ丁寧に保存したならばマイグレーションはあなたの手に委ねられている。実装方法にもよるのだけれど、Serializableの守備範囲内であれば対応出来そうフィールドが消えたり増えたりする程度は問題無さそう。スキーマは動的だからマイグレーションいらず、とReadmeにドキュメント型なので、好き勝手やって良さそうに見える
33
1対多の関係を作ることが出来るかYesYesYesYesYes / https://github.com/satyan/sugar/issues/60Yes / https://github.com/agrosner/DBFlow/wiki/Building-your-database-structure?Yes?????????Yes / http://realm.io/docs/java/0.74.0/#relationships???YesYes
34
多対多の関係を作ることが出来るかYes / http://stackoverflow.com/questions/9175198/what-is-the-best-way-to-implement-many-to-many-relationships-using-ormliteYes / http://greendao-orm.com/documentation/relations/Yes / https://github.com/pardom/ActiveAndroid/issues/46?No / 1.4で対応されたらいいですね https://github.com/satyan/sugar/wiki/Plan-for-1.4-releaseNo / でも One-Manyの応用で作れそうな気もするがなぁ???????????Yes / http://realm.io/docs/java/0.74.0/#relationships????Yes / Many-Manyは工夫次第というかんじか?
35
ContentProviderを提供するためのクラスが提供されているか???Yes / OllieProviderを継承する。これはContentProviderを継承している?Yes / https://github.com/Raizlabs/DBFlow/blob/master/usage/ContentProviderGenerators.md???Yes?????Yes / 標準対応Yes / 標準対応No / ググると簡単に方法が見つかるNoNoNoNoNo
36
モデルの定義方法アノテーションジェネレーター継承 & アノテーション継承 & アノテーションアノテーション継承 & アノテーションXMLアノテーションアノテーションアノテーション継承アノテーション(生成されたクラスを使う)アノテーションアノテーションと継承アノテーション もしくは/かつ 継承アノテーション, アノテーション & 継承継承無しSerializableをimplement無し継承
37
JavaBeans強制NoYesNoNoNoNoYesNoNoNoYes / ビルダーパターンNoYesNoNoNoNoYesNoNoNoYes
38
クエリービルダー搭載YesYesYesYes / ちょっと弱いかもNoYesNoYesYes / ちょっと独特であるNoYes / ちょっと弱いYesYesNoYesYes / やや弱いかYes / やや弱いかYes / やや弱いかNo / というかキー名での絞り込みしかできないNo / というかフィールドで絞り込めないNo / というかフィールドで絞り込めないYes
39
RxJava対応NoNoNoYesNoNoYesYesNoNoNoNoYes / squidb-reactiveを使う(公式提供)YesNoNoNoNoNoNoNoNo
40
トランザクション対応YesYesYesYesYesYesYesYesNoYesNo? / ListのSaveをトランザクション対応と呼んで良いものか。。。YesYesNo? / ListのSaveをトランザクション対応と呼んで良いものか。。。? / ListのSaveをトランザクション対応と呼んで良いものか。。。YesNoNoNo? / ListのSaveをトランザクション対応と呼んで良いものか。。。
41
その他コードジェネレーターはGroovyで書くと心理的に心地よいと思った。ActiveAndroidと比較すると、反省点への対応が見られる。また本資料作成段階においてRxJavaに対応しているORMとしては初観測である。ActiveAndroidよりも機能が少なく見える。ContentObserver(変更通知、残念ながらRxJava準拠ではないようだ)などの機能を持っているらしいなんかうまくDate型の読み込みが安定しないのでコメントアウト思ったより薄く守備していると書いたが、ORM部分はしっかりしてるな、という印象。primitive型は使えない。Date型もダメっぽい。罠すぎる_idの命名が固定なのはどうかと思うが、まぁどうでも良いところ。
ContentProviderとCursorについてドキュメントがあり気概を感じる
int id;が無いとaptで落ちます。あとboolean使えない。BooleanはOK。
複雑過ぎるAPI設計は、単なるORMとしては厳しすぎるのではないか?
RushObjectの継承で定義するが、それが出来ない場合にRush interfaceの実装でもOKとしているのが、わかってる感高いDate型対応してない。公式ドキュメントでもlongを格納しているらしき記述があった。→のコメントを書いたのはQuantumFluxの評価前だったので、なんかおかしな事言ってますが面白いのであえて残すなんかめちゃくちゃQuantumFlexと似てるんだけど・・・
ところでバッチ挿入を10000件やると、Binder付近でエラーを吐くので、テストでそのあたりを労るように書いている。QuantumFluxはその点を改善しているように見える
NoSQLなのにトランザクションがあるというのは独特だよなぁ、と思ったBook#write()でlistを放り込めるの、ちょっとズルいと思ったw惜しい!モデル定義が手間過ぎるのでaptで出来るようになったりすると化けそう。
42
43
4. 性能比較
44
ベンチマーク取得対象?YesYesYesYesYesYesYesYesYesYesYesYesYesYesNoYesYesYesYesYesYesYesYesNo
45
参考記録?YesYesYes
46
4.1 10k BulkMode ON
47
4.1.1 1回目
48
INSERT77751827195114501130702212413655354200310304930157741125996142612314
49
SELECT2701942201121430725696294797812560125146512589772432138
50
4.1.2 2回目
51
INSERT76931845195504571129621819415760304122307634921157940516030140711313
52
SELECT2578922251108831145775865318402679127039612099482532225
53
4.1.3 3回目
54
INSERT74551758192644437129411820413758874233302834939170742056091138011169
55
SELECT26169522091045310156958750681325751326398120310102552188
56
4.1.4 4回目
57
INSERT73681859188464358134941877409858544213303394987158241345937143311195
58
SELECT26611072299103231985716595397482613136539512359752442144
59
4.1.5 5回目
60
INSERT74592039186684750131331801429858074333303294874156140956069143211197
61
SELECT25139823871193309458858155682125611267430127610012522168
62
4.1 まとめ(平均値)
63
INSERT75501865.619167.84523.4131201905.84165.25822.6#DIV/0!4220.2#DIV/0!30548.84930.21601.2#DIV/0!#DIV/0!4119.46024.61415.6#DIV/0!#DIV/0!#DIV/0!11437.6#DIV/0!
64
SELECT2613.897.22269.41114.43115.8574.8608.4522.2#DIV/0!800.6#DIV/0!2597.61295.8416.8#DIV/0!#DIV/0!1236.2982.2249.4#DIV/0!#DIV/0!#DIV/0!2172.6#DIV/0!
65
66
4.2 10k BulkMode OFF
67
4.2.1 1回目
68
INSERT110572887001187471066141244661039271100351110361092581076211483591258601124648913916693733255602931307983672248551128136822
69
SELECT240854021301098309447655755965678217002326131838214703114289524367664114862018
70
4.2.2 2回目
71
INSERT112077873631187831067721237791031611099851117461088161087751457931255761113909016319030433066622441296863677243881180135215
72
SELECT242649821631086287352955252266979718562450127233914483107392725865768215811893
73
4.2.3 3回目
74
INSERT110132866011183611065821234371046511091551117421073341103931494941252741117998911418852833523606211292183560244611179134906
75
SELECT231250420791148301949453355262877616782417117538014525117088422871367014671866
76
4.2.4 4回目
77
INSERT109278894601189201061121233031060131097571113011083031095101486421251891114218954918985833140611211283553591249411187134794
78
SELECT232149722181122301151056047976882018142445133537613853109394924068665515182025
79
4.2.5 5回目
80
INSERT111098898451180911064321231681051671105631111101087431101281516871259761111658962319145633408601861281743689241441172130884
81
SELECT245744122361088289749650448468377718752423125239714468117991124067764815851874
82
4.1 まとめ(平均値)
83
INSERT110631.488393.8118580.4106502.4123630.6104583.8109899111387108490.8109285.4148795125575111647.889517.6#DIV/0!185416.633278.460893129246.23637.824557.81169.2134524.2#DIV/0!
84
SELECT2384.84962165.21108.42978.8501541.2519.2680.8790.41784.62412.21270.4374.8#DIV/0!14406.41131.4913.2241.8681.8659.21527.41935.2#DIV/0!
85
備考今回からRealmのSELECTは、RealmResult<E>の取得タイム+List<E>への変換タイム としています。なおRealmResultの取得タイムは以下の通り。
86
Bulk: ON
1回目: 4ms
2回目: 4ms
3回目: 5ms
4回目: 5ms
5回目: 4ms
87
Bulk: OFF
1回目: 2ms
2回目: 2ms
3回目: 2ms
4回目: 3ms
5回目: 3ms
88
89
90
91
92
93
94
95
96
97
98
99
100
Loading...
 
 
 
Data
AVERAGE
Graph(BulkMode:ON)
Graph(BulkMode:OFF)