Slide 1

Slide 1 text

eight  Android  アプリでの   Realm導⼊入事例例 Realm  meet  up  #9   Sansan株式会社  ⼭山本純平

Slide 2

Slide 2 text

⾃自⼰己紹介 ⼭山本純平   Sansan株式会社   Eight事業部   Androidアプリ担当   2015年年6⽉月⼊入社   前職では   • ガラケーのネイティブアプリの開発   • スマートフォンのプラットフォーム   • WPFアプリ   • iOSアプリ   @boohbah

Slide 3

Slide 3 text

アジェンダ • Eightの紹介   • Realm   • Realm導⼊入のメリット   • ⼯工夫した点   • Realmのデバッグツール、テスト

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

No content

Slide 6

Slide 6 text

名刺刺管理理アプリからビジネスネットワーキングサービスへ進化       フィードの投稿   ニュースの配信

Slide 7

Slide 7 text

プロフィールの公開

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

For  Android @yanzam @zaki50

Slide 10

Slide 10 text

Slackでのサポート

Slide 11

Slide 11 text

ソースレビュー

Slide 12

Slide 12 text

⽉月に2回のレクチャー • Lintの警告とその対処⽅方法   • Master  of  Fragment   • いかにViewがレイアウトされるか   • Recycle  View実装について   • Retrofit  +  RxJava  ハンズオン   • Dagger2  +  Robolectric  +  Espresso  +  PowerMockitでテスト環 境  ハンズオン   • Proguard設定の詳細   • Annotation  Processing概要   • Android  Studioでのgradleビルド詳細   • BLEの実装について  

Slide 13

Slide 13 text

Eightの設計も⽇日々進化 • Lintの警告数が約半分に   • Realmの導⼊入   • RxJavaの導⼊入   • DataBindingの導⼊入   • Dagger2導⼊入でモジュールのDI化   • UnitTest   • Kotlin導⼊入   などを⾏行行いながら⽇日々のメンテ、新規機能開発をしていま す。

Slide 14

Slide 14 text

Sansanのアプリ開発チーム • 法⼈人向けSansanアプリ   • iOS開発者  2名   • Android開発者  2名   • 個⼈人向けアプリEight   • iOS開発者  2名  +  業務委託1名   • Android開発者  1名  +  業務委託  1名

Slide 15

Slide 15 text

$PQZSJHIU˜4BOTBO *OD"MMSJHIUTSFTFSWFE 4BOTBO͸Ұॹʹ৽͍͠Ձ஋Λ࡞͍ͬͯ͘ ஥ؒΛ͕͍ͯ͞͠·͢ɻ 3VCZ 3VCZPO3BJMT ʢ8FCΞϓϦέʔγϣϯʣ $ɼ"41/&5.7$ ʢ8FCΞϓϦέʔγϣϯʣ J04"OESPJEΞϓϦ   ݸਓ޲໊͚ࢗ؅ཧΞϓϦʮ&JHIUʯ   ໊ࢗσʔλԽ෼ࢄॲཧγεςϜ   ๏ਓ޲໊͚ࢗ؅ཧαʔϏεʮ4BOTBOʯ   ๏ਓ޲໊͚ࢗ؅ཧαʔϏε ʮ4BOTBOʯ   ݸਓ޲໊͚ࢗ؅ཧΞϓϦʮ&JHIUʯ ΤϯδχΞืूத 4BOTBO࠾༻ ݕࡧ SFDSVJU!TBOTBODPN·Ͱ ͓ؾܰʹ͝࿈བྷ͍ͩ͘͞ɻ ڵຯͷ͋Δํ͸

Slide 16

Slide 16 text

Realm • Realm導⼊入以前   • Realm導⼊入のメリット   • Realmでの実装の詳細   • デバッグ   • テスト

Slide 17

Slide 17 text

Realm導⼊入以前 • そもそもORMは使⽤用せずSQLiteを直接利利⽤用   • SQLの⽣生成のコードが読みづらい。   • メンテが⼤大変。データの把握もままならず

Slide 18

Slide 18 text

Realm導⼊入のメリット • ⾼高速   • コンセプトが明確で概念念の把握がしやすい   • 導⼊入が楽   • (SQLite利利⽤用に⽐比べて)ソースの記述量量が圧倒的に 少ない   • ⼿手厚いサポート 正直⾔言って苦労した点はほとんどなし

Slide 19

Slide 19 text

Feedデータの保存に   Realmを使⽤用 • サーバから取得してきた データのキャッシュ   • ⼀一覧表⽰示⽤用   • 詳細表⽰示⽤用

Slide 20

Slide 20 text

Data  structure

Slide 21

Slide 21 text

Realm  for  JavaのRealmObject • オブジェクトの継承はサポートしていない   • プロパティのsetter/getter以外のメソッドの定義 ができない   • 永続化しないプロパティには@Ignoreをつける   • Annotation  Processorによって定義したクラス のサブクラスのコードが⽣生成される

Slide 22

Slide 22 text

public  class  CardUpdateDetail  extends  RealmObject    implements  FeedItemDetail{
        @PrimaryKey
        private  String  postId;
 } public  interface  FeedItemDetail  {
 } RealmObjectの拡張クラスをFeedItemDetailの実装とする public  class  CardUpdateDetail  extends  RealmObject    implements  FeedItemDetail{
        /*  ..  */  
 } public  class  CardUpdateDetail  extends  RealmObject    implements  FeedItemDetail{
        /*  ..  */
 }

Slide 23

Slide 23 text

public  class  FeedItem  extends  RealmObject  {
        private  int  kind;
        @Ignore
        private  FeedItemDetail  feedItemDetail;
 
        public  FeedItemDetail  getFeedItemDetail()  {
 
                if  (this.feedItemDetail  !=  null)  {
                        return  feedItemDetail;
                }
 
                int  kind  =  getKind();
                String  postId  =  getPostId();
                switch  (kind)  {
                        case  FEED_ITEM_KIND_CARD_UPDATE:
                                this.feedItemDetail  =  realm.where(CardUpdateDetail.class).                                  break;
                        case  FEED_ITEM_KIND_SHARED_LINK:
                                this.feedItemDetail  =  realm.where(SharedLinkDetail.class).
                                break;
                      /*  ...  */
                }
                return  feedItemDetail;
        }
 }   @Ignore指定された   プロパティは   永続化されない getterでアクセス時に   クエリをかけて   メモリ上にキャッシュ

Slide 24

Slide 24 text

Data  structure

Slide 25

Slide 25 text

Realmデータのデバッグ

Slide 26

Slide 26 text

stetho-‐‑‒realm • zaki50さんが開発のstethoプラグイン   • https://github.com/uPhyca/stetho-‐‑‒realm   • stetho上でRealmデータの閲覧が可能

Slide 27

Slide 27 text

stetho • stethoはfacebook社で開発されたDebugツール   • ChromeのインスペクタからAndroidアプリのViewのツ リー構造、Network状況、SQLiteデータなどが閲覧可能

Slide 28

Slide 28 text

with  stetho-‐‑‒realm stetho上でRealmのDBの状況を   リアルタイムに把握

Slide 29

Slide 29 text

Realm環境でのテスト

Slide 30

Slide 30 text

JVM上でRealmを使ったテストをしたい • RealmはAndroidのネイティブライブラリ   • Robolectric等を⽤用いたJVM上でのテストでは読み 込めない   • Realmオブジェクト⾃自体もfinalクラスなので Mockito等でMock化することはできない

Slide 31

Slide 31 text

PowerMockを使う • finalクラスのMock化が可能!   • staticメソッドのMock化も可能!   • privateメソッドの呼び出しもできてしまう   • どうやらクラスローダを差し替えているらしい   • Mockitoと⼀一緒につかう   • 遅い   https://github.com/jayway/powermock   https://github.com/robolectric/robolectric/wiki/ Using-‐‑‒PowerMock

Slide 32

Slide 32 text

RunWith(RobolectricGradleTestRunner.class)
 @Config(constants  =  BuildConfig.class,  sdk  =  21)
 @PowerMockIgnore({"org.mockito.*",  "org.robolectric.*",  "android.*"})
 @PrepareForTest({Realm.class})
 public  class  ExampleUnitTest  {
        @Rule
        public  PowerMockRule  rule  =  new  PowerMockRule();
 
        @Test
        public  void  mockRealm()  throws  Exception  {
                final  Realm  mockRealm  =  PowerMockito.mock(Realm.class);
 
                PowerMockito.when(mockRealm.isAutoRefresh()).thenReturn(true);
 
                assertThat(mockRealm.isAutoRefresh(),  is(true));
        }
 }
 mock化したいクラスを指定 mockするメソッドの記述 Robolectric上でPowerMockを   動作させるためのおまじない

Slide 33

Slide 33 text

まとめ • Realmは簡単、便便利利   • @Ingnoreを使ってオブジェクトの継承関係を擬 似的に実装   • stetho-‐‑‒realmを使うとデバッグも便便利利   • PowerMockでJVM上でのテストも可能

Slide 34

Slide 34 text

Thank  you!