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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Wataru Mizukami
March 18, 2019
Technology
1k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Realm Cloudを使ったオフラインファーストなアプリ開発
Wataru Mizukami
March 18, 2019
More Decks by Wataru Mizukami
See All by Wataru Mizukami
GitHub Actions活用術
tarumzu
1
820
CIサービス「Bitrise」を使って 最小限の労力でDanger + ktlintをGithubと連携させる
tarumzu
1
1.1k
JavaScriptでWebViewをハックする
tarumzu
2
1.5k
ViewFlipperで手軽にリッチアニメーション
tarumzu
0
610
Kotlin serializationの使い方を詳しく調べてみた
tarumzu
2
1.7k
Other Decks in Technology
See All in Technology
JJUG CCC 2026 Spring AI時代の開発こそ標準化を武器に! ― 方式・プロセス・プラットフォームの標準化
s27watanabe
2
720
AI フレンドリーなエラー監視を TypeScript で実現する
shinyaigeek
2
260
地元にいないローカルオーガナイザーの立ち回り
uvb_76
1
470
Oracle AI Database@AWS:サービス概要のご紹介
oracle4engineer
PRO
4
2.8k
「嘘をつくテスト」の失敗例から学ぶ 良いテストコード #frontend_phpcon_do
asumikam
0
480
新規ゲーム開発におけるAI駆動開発のリアル
202409e2
0
2.6k
実装は速くなった、レビューはどうする? ― 自身のレビューをAIで再現させるサーヴァントエンジニアリングのすゝめ / Implementation got faster. So what about reviews? — An invitation to Servant Engineering: Recreating your own code reviews with AI
nrslib
7
3.9k
速さだけじゃない! VoidZero ツールが移行先に選ばれる理由
mizdra
PRO
6
750
AI-DLCを活用した高品質・安全なAI駆動開発実践 / AI Driven Development
yoshidashingo
1
370
Diagnosing performance problems without the guesswork
elenatanasoiu
0
170
サプライチェーンセキュリティの空白地帯 - 信頼できる”依存性”の未来を考える
rung
PRO
2
700
AI駆動開発が変える、大規模開発の前提 ーHuman in the Loop から Human on the Loop へ / AIE2026
visional_engineering_and_design
12
7.1k
Featured
See All Featured
Joys of Absence: A Defence of Solitary Play
codingconduct
1
390
We Are The Robots
honzajavorek
0
240
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
240
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
270
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
220
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
150
Crafting Experiences
bethany
1
170
Rails Girls Zürich Keynote
gr2m
96
14k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
320
Are puppies a ranking factor?
jonoalderson
1
3.5k
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
ご清聴、ありがとうございました!