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
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
430
#DroidKaigi 既存のAndroidプロジェクトに Kotlinを導入した話
boohbah
5
2.8k
Other Decks in Programming
See All in Programming
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
280
残高管理から台帳サービスへの進化
artoy
1
210
iOS 27でニュースアプリはどう変わる!? 〜日経電子版の新機能対応と、開発事例から〜
lynnswap
7
13k
Workers Cache を知る
syumai
0
370
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
170
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
190
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
280
[2026-10-14](C)Re:ゼロから始める異世界生活〜始まりの終わりと終わりの始まり〜
tosite
0
140
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
440
作って学ぶSpring BootのAuto Configuration / JJUG Night Seminar 2026-10-19
rshindo
0
190
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
6.8k
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
190
Featured
See All Featured
Abbi's Birthday
coloredviolet
4
10k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
Music & Morning Musume
bryan
48
7.4k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
640
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.7k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
570
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
340
How to make the Groovebox
asonas
2
2.5k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
Making the Leap to Tech Lead
cromwellryan
135
10k
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!