Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Realm meet up #9
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Jumpei Yamamoto
November 28, 2015
Programming
2.2k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Realm meet up #9
eight Androidアプリの開発の取り組みと
Realmの導入事例について
Jumpei Yamamoto
November 28, 2015
More Decks by Jumpei Yamamoto
See All by Jumpei Yamamoto
KotlinでDSLを作る #Kotlin_Sansan
boohbah
2
1.8k
みんな大好き拡張関数 #kotlin_sansan
boohbah
2
9.6k
sealed class in Kotlin1.1
boohbah
1
1.9k
Sansanではたらくアプリエンジニアの20%ルール
boohbah
0
830
KotlinでDSL
boohbah
0
9.9k
ObservableArrayとPikkel
boohbah
2
1.4k
KotlinでPhantom Type #kotlin_sansan
boohbah
2
4k
#jkug Kotlinのclass delegation
boohbah
1
420
#DroidKaigi 既存のAndroidプロジェクトに Kotlinを導入した話
boohbah
5
2.8k
Other Decks in Programming
See All in Programming
Streamlitで実現する自然言語データアプリ開発
ayumu_yamaguchi
1
330
FreeBSDでZabbixを動かす
kenkino
0
340
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
600
Heart of Swift Concurrency
koher
0
1.1k
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
290
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
4
460
mrbgem 三角測量 開発
ogom
0
170
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
420
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
380
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
8
5.3k
Turning Architecture into Unit Tests in the AI Era (NSSpain XIV)
steliosf
PRO
1
120
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
140
Featured
See All Featured
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
Marketing to machines
jonoalderson
1
5.8k
Odyssey Design
rkendrick25
PRO
2
850
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
690
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
620
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Optimizing for Happiness
mojombo
378
71k
Rails Girls Zürich Keynote
gr2m
96
14k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
450
AI Search: Where Are We & What Can We Do About It?
aleyda
0
8k
Transcript
eight Android アプリでの Realm導⼊入事例例 Realm meet up #9
Sansan株式会社 ⼭山本純平
⾃自⼰己紹介 ⼭山本純平 Sansan株式会社 Eight事業部 Androidアプリ担当 2015年年6⽉月⼊入社
前職では • ガラケーのネイティブアプリの開発 • スマートフォンのプラットフォーム • WPFアプリ • iOSアプリ @boohbah
アジェンダ • Eightの紹介 • Realm • Realm導⼊入のメリット
• ⼯工夫した点 • Realmのデバッグツール、テスト
None
None
名刺刺管理理アプリからビジネスネットワーキングサービスへ進化 フィードの投稿 ニュースの配信
プロフィールの公開
None
For Android @yanzam @zaki50
Slackでのサポート
ソースレビュー
⽉月に2回のレクチャー • Lintの警告とその対処⽅方法 • Master of Fragment •
いかにViewがレイアウトされるか • Recycle View実装について • Retrofit + RxJava ハンズオン • Dagger2 + Robolectric + Espresso + PowerMockitでテスト環 境 ハンズオン • Proguard設定の詳細 • Annotation Processing概要 • Android Studioでのgradleビルド詳細 • BLEの実装について
Eightの設計も⽇日々進化 • Lintの警告数が約半分に • Realmの導⼊入 • RxJavaの導⼊入
• DataBindingの導⼊入 • Dagger2導⼊入でモジュールのDI化 • UnitTest • Kotlin導⼊入 などを⾏行行いながら⽇日々のメンテ、新規機能開発をしていま す。
Sansanのアプリ開発チーム • 法⼈人向けSansanアプリ • iOS開発者 2名 • Android開発者
2名 • 個⼈人向けアプリEight • iOS開発者 2名 + 業務委託1名 • Android開発者 1名 + 業務委託 1名
$PQZSJHIU4BOTBO *OD"MMSJHIUTSFTFSWFE 4BOTBOҰॹʹ৽͍͠ՁΛ࡞͍ͬͯ͘ ؒΛ͕͍ͯ͞͠·͢ɻ 3VCZ 3VCZPO3BJMT ʢ8FCΞϓϦέʔγϣϯʣ $ɼ"41/&5.7$ ʢ8FCΞϓϦέʔγϣϯʣ J04"OESPJEΞϓϦ
ݸਓ໊͚ཧΞϓϦʮ&JHIUʯ ໊σʔλԽࢄॲཧγεςϜ ๏ਓ໊͚ཧαʔϏεʮ4BOTBOʯ ๏ਓ໊͚ཧαʔϏε ʮ4BOTBOʯ ݸਓ໊͚ཧΞϓϦʮ&JHIUʯ ΤϯδχΞืूத 4BOTBO࠾༻ ݕࡧ SFDSVJU!TBOTBODPN·Ͱ ͓ؾܰʹ͝࿈བྷ͍ͩ͘͞ɻ ڵຯͷ͋Δํ
Realm • Realm導⼊入以前 • Realm導⼊入のメリット • Realmでの実装の詳細
• デバッグ • テスト
Realm導⼊入以前 • そもそもORMは使⽤用せずSQLiteを直接利利⽤用 • SQLの⽣生成のコードが読みづらい。 • メンテが⼤大変。データの把握もままならず
Realm導⼊入のメリット • ⾼高速 • コンセプトが明確で概念念の把握がしやすい • 導⼊入が楽
• (SQLite利利⽤用に⽐比べて)ソースの記述量量が圧倒的に 少ない • ⼿手厚いサポート 正直⾔言って苦労した点はほとんどなし
Feedデータの保存に Realmを使⽤用 • サーバから取得してきた データのキャッシュ • ⼀一覧表⽰示⽤用
• 詳細表⽰示⽤用
Data structure
Realm for JavaのRealmObject • オブジェクトの継承はサポートしていない • プロパティのsetter/getter以外のメソッドの定義 ができない
• 永続化しないプロパティには@Ignoreをつける • Annotation Processorによって定義したクラス のサブクラスのコードが⽣生成される
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{ /* .. */ }
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でアクセス時に クエリをかけて メモリ上にキャッシュ
Data structure
Realmデータのデバッグ
stetho-‐‑‒realm • zaki50さんが開発のstethoプラグイン • https://github.com/uPhyca/stetho-‐‑‒realm • stetho上でRealmデータの閲覧が可能
stetho • stethoはfacebook社で開発されたDebugツール • ChromeのインスペクタからAndroidアプリのViewのツ リー構造、Network状況、SQLiteデータなどが閲覧可能
with stetho-‐‑‒realm stetho上でRealmのDBの状況を リアルタイムに把握
Realm環境でのテスト
JVM上でRealmを使ったテストをしたい • RealmはAndroidのネイティブライブラリ • Robolectric等を⽤用いたJVM上でのテストでは読み 込めない • Realmオブジェクト⾃自体もfinalクラスなので
Mockito等でMock化することはできない
PowerMockを使う • finalクラスのMock化が可能! • staticメソッドのMock化も可能! • privateメソッドの呼び出しもできてしまう
• どうやらクラスローダを差し替えているらしい • Mockitoと⼀一緒につかう • 遅い https://github.com/jayway/powermock https://github.com/robolectric/robolectric/wiki/ Using-‐‑‒PowerMock
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を 動作させるためのおまじない
まとめ • Realmは簡単、便便利利 • @Ingnoreを使ってオブジェクトの継承関係を擬 似的に実装 • stetho-‐‑‒realmを使うとデバッグも便便利利
• PowerMockでJVM上でのテストも可能
Thank you!