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
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
MIERUNE JCT 発表資料「宇宙から伊能忠敬ごっこ」
syuchimu
0
190
先取りMaven4 ~16年ぶりのメジャーアップデート、その進化とは?~
ogiwarat
0
140
Claude Codeを組織で使いこなす— サーバサイドAIエージェント運用の実践知
techtekt
PRO
0
200
コードレビューを制するチームがソフトウェアデリバリーのフローを制す / Beyond Code Review: Distributing Its Responsibilities Across the SDLC
mtx2s
4
1.1k
形式手法特論:公平性制約の位相的特徴づけ #kernelvm / Kernel VM Study Kansai 12th
ytaka23
1
760
SIer20年! 培ったスキルがスタートアップで輝く時
shucho0103
0
420
Cloud Run のアップデート 触ってみる&紹介
gre212
0
320
Amazon Bedrock AgentCore ワークショップ JAWS UG TOHOKU / amazon-bedrock-agentcore-workshop-jawsug-tohoku-2026
gawa
8
300
AI Testing Talks: Challenges of Applying AI in Software Testing: From Hype to Practical Use
exactpro
PRO
1
130
LLMと共に進化するプロセスを目指して
ymatsuwitter
12
3.2k
React、まだ楽しくて草
uhyo
7
4.1k
AI と創る新たな世界 / A New World Created with AI
ks91
PRO
0
110
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
280
Color Theory Basics | Prateek | Gurzu
gurzu
0
350
HDC tutorial
michielstock
2
690
Prompt Engineering for Job Search
mfonobong
0
330
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.3k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.5k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Ethics towards AI in product and experience design
skipperchong
2
300
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
160
Unsuck your backbone
ammeep
672
58k
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
ご清聴、ありがとうございました!