Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Realm Cloudを使ったオフラインファーストなアプリ開発
Search
Wataru Mizukami
March 18, 2019
Technology
2
900
Realm Cloudを使ったオフラインファーストなアプリ開発
Wataru Mizukami
March 18, 2019
Tweet
Share
More Decks by Wataru Mizukami
See All by Wataru Mizukami
GitHub Actions活用術
tarumzu
1
780
CIサービス「Bitrise」を使って 最小限の労力でDanger + ktlintをGithubと連携させる
tarumzu
1
1k
JavaScriptでWebViewをハックする
tarumzu
2
1.4k
ViewFlipperで手軽にリッチアニメーション
tarumzu
0
590
Kotlin serializationの使い方を詳しく調べてみた
tarumzu
2
1.6k
Other Decks in Technology
See All in Technology
【NoMapsTECH 2025】AI Edge Computing Workshop
akit37
0
220
Autonomous Database - Dedicated 技術詳細 / adb-d_technical_detail_jp
oracle4engineer
PRO
4
10k
研究開発と製品開発、両利きのロボティクス
youtalk
1
530
AIのグローバルトレンド2025 #scrummikawa / global ai trend
kyonmm
PRO
1
300
現場で効くClaude Code ─ 最新動向と企業導入
takaakikakei
1
260
新アイテムをどう使っていくか?みんなであーだこーだ言ってみよう / 20250911-rpi-jam-tokyo
akkiesoft
0
310
Terraformで構築する セルフサービス型データプラットフォーム / terraform-self-service-data-platform
pei0804
1
190
AWSを利用する上で知っておきたい名前解決のはなし(10分版)
nagisa53
10
3.2k
はじめてのOSS開発からみえたGo言語の強み
shibukazu
3
900
【実演版】カンファレンス登壇者・スタッフにこそ知ってほしいマイクの使い方 / 大吉祥寺.pm 2025
arthur1
1
890
なぜスクラムはこうなったのか?歴史が教えてくれたこと/Shall we explore the roots of Scrum
sanogemaru
5
1.6k
Android Audio: Beyond Winning On It
atsushieno
0
2.4k
Featured
See All Featured
Code Reviewing Like a Champion
maltzj
525
40k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Building Better People: How to give real-time feedback that sticks.
wjessup
368
19k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
61k
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
Mobile First: as difficult as doing things right
swwweet
224
9.9k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.4k
The Power of CSS Pseudo Elements
geoffreycrofte
77
6k
Intergalactic Javascript Robots from Outer Space
tanoku
272
27k
Why You Should Never Use an ORM
jnunemaker
PRO
59
9.5k
For a Future-Friendly Web
brad_frost
180
9.9k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Transcript
Realm Cloudを使った オフラインファーストなアプリ開発 Wataru Mizukami(水上 亘) Otemachi.apk #02
自己紹介 Wataru Mizukami/水上 亘 / @tarumzu (たる) Organization/ sikmi,
inc.
Realmとは - モバイルアプリに組み込んで利用するためのRDBMS - 同じようなシステムとしてSQLiteやCoreDataがある
Realmとは - モバイルアプリに組み込んで利用するためのRDBMS - 同じようなシステムとしてSQLiteやCoreDataがある - 最近、AndroidではRoomなどの登場により、徐々に下火にな りつつある
Realm Cloudとは - Realmの特徴に加え、オフラインファースト機能、リアルタイム データ同期機能がある - オンラインとオフラインでコードを書き分ける必要がない - マルチプラットフォーム間で同期可能
でもこの特徴って、Firebase Realtime DatabaseやCloud Firestoreも大体同じ じゃない?
Firebaseより勝っている点 - RDBなのでクエリで色々イジりたいときに便利 - 電波が不安定なところではローカルDBを優先するため早く処 理できる。Firebaseでは今の所、タイムアウトの機能がないた め待ちが発生する オフラインファーストという点で考えればまだ需要はある!
それでは実践!
実践: アカウント登録 まずは下記からアカウント登録 https://cloud.realm.io/login
実践: インスタンス作成 作成したらWebコンソールのCreate New Instanceボタンからインスタンス を作成 選べるリージョンは下記2つ - US West
- Germany
実践: インスタンス設定 アプリからRealm Cloudへログインす る方式を選択 - おすすめはJWT方式 - 注) 別途JWTを発行するサーバーを自
前で用意するのが面倒。 - デフォルトでNicknameやAnonymous方 式が有効になっているので無効にする のを忘れずに
実践: スキーマ定義 open class Test1( @PrimaryKey var testId: Int =
0, var testList: RealmList<Test2>? = null ): RealmObject()
実践: スキーマ定義 open class Test1( @PrimaryKey var testId: Int =
0, var testList: RealmList<Test2>? = null ): RealmObject() - Openでスキーマクラスを定義 - RealmObjectを継承する
実践: スキーマ定義 open class Test1( @PrimaryKey var testId: Int =
0, var testList: RealmList<Test2>? = null ): RealmObject() - 主キーにはPrimaryKeyアノ テーションを付与 - 必ず一つ主キーを保つ必要 がある - 複合キーは出来ないので注 意
実践: スキーマ定義 open class Test1( @PrimaryKey var testId: Int =
0, var testList: RealmList<Test2>? = null ): RealmObject() リレーションはRealmListで定義
実践: アプリからRealm Cloudへのログイン val credentials = SyncCredentials.jwt(“authToken”) SyncUser.logInAsync(credentials, "https://${getString(R.string.realm_instance_address)}/auth", object
: SyncUser.Callback<SyncUser> { override fun onSuccess(result: SyncUser) { // ログイン成功した場合の処理 } override fun onError(error: ObjectServerError) {} })
実践: アプリからRealm Cloudへのログイン val credentials = SyncCredentials.jwt(“authToken”) SyncUser.logInAsync(credentials, "https://${getString(R.string.realm_instance_address)}/auth", object
: SyncUser.Callback<SyncUser> { override fun onSuccess(result: SyncUser) { // ログイン成功した場合の処理 } override fun onError(error: ObjectServerError) {} }) この例ではJWT認証を利用
実践: アプリからRealm Cloudへのログイン val credentials = SyncCredentials.jwt(“authToken”) SyncUser.logInAsync(credentials, "https://${getString(R.string.realm_instance_address)}/auth", object
: SyncUser.Callback<SyncUser> { override fun onSuccess(result: SyncUser) { // ログイン成功した場合の処理 } override fun onError(error: ObjectServerError) {} }) 非同期でログイン処理を行う
実践: マイグレーション val config = SyncConfiguration.Builder(SyncUser.current(), "realms://${getString(R.string.realm_instance_address)}/${uid}/myRealm").waitForInit ialRemoteData().schemaVersion(1).build() Realm.setDefaultConfiguration(config)
実践: マイグレーション val config = SyncConfiguration.Builder(SyncUser.current(), "realms://${getString(R.string.realm_instance_address)}/${uid}/myRealm").waitForInit ialRemoteData().schemaVersion(1).build() Realm.setDefaultConfiguration(config) -
ネットに繋がっている場合は データの同期が終わるまで待 つ。繋がっていなければス キップ
実践: マイグレーション val config = SyncConfiguration.Builder(SyncUser.current(), "realms://${getString(R.string.realm_instance_address)}/${uid}/myRealm").waitForInit ialRemoteData().schemaVersion(1).build() Realm.setDefaultConfiguration(config) テーブル構成のバージョンを定
義。構成を変更する場合はバー ジョンを上げることでマイグレー ションしてくれる
実践: マイグレーション val config = SyncConfiguration.Builder(SyncUser.current(), "realms://${getString(R.string.realm_instance_address)}/${uid}/myRealm").waitForInit ialRemoteData().schemaVersion(1).build() Realm.setDefaultConfiguration(config) DefaultConfigに設定することで、
以後Realm.XXXでDBにアクセス できる
あとは通常のRealmの使い方と同じ
実践: おまけ Realm.getInstanceAsync(requireNotNull(Realm.getDefaultConfiguration()), object : Realm.Callback() { override fun onSuccess(result:
Realm) { result.executeTransactionAsync { realm -> var test1 = realm.where(Test1::class.java).equalTo("testId",1.toInt()).findFirst() test1 ?: run { realm.insertOrUpdate(Test1()) } } } })
実践: おまけ Realm.getInstanceAsync(requireNotNull(Realm.getDefaultConfiguration()), object : Realm.Callback() { override fun onSuccess(result:
Realm) { result.executeTransactionAsync { realm -> var test1 = realm.where(Test1::class.java).equalTo("testId",1.toInt()).findFirst() test1 ?: run { realm.insertOrUpdate(Test1()) } } } }) - 非同期でインスタンスを取得
実践: おまけ Realm.getInstanceAsync(requireNotNull(Realm.getDefaultConfiguration()), object : Realm.Callback() { override fun onSuccess(result:
Realm) { result.executeTransactionAsync { realm -> var test1 = realm.where(Test1::class.java).equalTo("testId",1.toInt()).findFirst() test1 ?: run { realm.insertOrUpdate(Test1()) } } } }) - このブロック内では最後自動 的にコミットされる
実践: おまけ Realm.getInstanceAsync(requireNotNull(Realm.getDefaultConfiguration()), object : Realm.Callback() { override fun onSuccess(result:
Realm) { result.executeTransactionAsync { realm -> var test1 = realm.where(Test1::class.java).equalTo("testId",1.toInt()).findFirst() test1 ?: run { realm.insertOrUpdate(Test1()) } } } }) - testId1のデータを取得
実践: おまけ Realm.getInstanceAsync(requireNotNull(Realm.getDefaultConfiguration()), object : Realm.Callback() { override fun onSuccess(result:
Realm) { result.executeTransactionAsync { realm -> var test1 = realm.where(Test1::class.java).equalTo("testId",1.toInt()).findFirst() test1 ?: run { realm.insertOrUpdate(Test1()) } } } }) - testId1がなかったら作成して Insert
まとめ - 簡単にクラウドに接続できる - RDBの強力なクエリが使える - オフラインファースト限定であればまだ戦える
宣伝 4/14開催の技術書典6でSwift/Kotlin愛好会合同執筆本として、 日本で唯一!のRealm Cloud入門書書くのでぜひ買いに来てくだ さい!他にも内容盛りだくさんです。 場所は「け18」 よろしくおねがいします! https://techbookfest.org/event/tbf06/circle/71750003
ご清聴、ありがとうございました!