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
960
Realm Cloudを使ったオフラインファーストなアプリ開発
Wataru Mizukami
March 18, 2019
Tweet
Share
More Decks by Wataru Mizukami
See All by Wataru Mizukami
GitHub Actions活用術
tarumzu
1
800
CIサービス「Bitrise」を使って 最小限の労力でDanger + ktlintをGithubと連携させる
tarumzu
1
1k
JavaScriptでWebViewをハックする
tarumzu
2
1.5k
ViewFlipperで手軽にリッチアニメーション
tarumzu
0
600
Kotlin serializationの使い方を詳しく調べてみた
tarumzu
2
1.6k
Other Decks in Technology
See All in Technology
Claude Codeを使った情報整理術
knishioka
19
11k
小さく、早く、可能性を多産する。生成AIプロジェクト / prAIrie-dog
visional_engineering_and_design
0
320
Master Dataグループ紹介資料
sansan33
PRO
1
4.2k
Redshift認可、アップデートでどう変わった?
handy
1
120
Authlete で実装する MCP OAuth 認可サーバー #CIMD の実装を添えて
watahani
0
390
自己管理型チームと個人のセルフマネジメント 〜モチベーション編〜
kakehashi
PRO
5
1.5k
複雑さを受け入れるか、拒むか? - 事業成長とともに育ったモノリスを前に私が考えたこと #RSGT2026
murabayashi
0
970
「アウトプット脳からユーザー価値脳へ」がそんなに簡単にできたら苦労しない #RSGT2026
aki_iinuma
6
3.3k
AIエージェントを5分で一気におさらい!AIエージェント「構築」元年に備えよう
yakumo
1
140
AI時代のアジャイルチームを目指して ー スクラムというコンフォートゾーンからの脱却 ー / Toward Agile Teams in the Age of AI
takaking22
9
3k
なぜ あなたはそんなに re:Invent に行くのか?
miu_crescent
PRO
0
250
Bedrock AgentCore Evaluationsで学ぶLLM as a judge入門
shichijoyuhi
2
310
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
135
9.7k
YesSQL, Process and Tooling at Scale
rocio
174
15k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
0
51
Optimising Largest Contentful Paint
csswizardry
37
3.5k
Between Models and Reality
mayunak
1
150
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Documentation Writing (for coders)
carmenintech
77
5.2k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
97
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
46
The Mindset for Success: Future Career Progression
greggifford
PRO
0
200
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
0
270
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
ご清聴、ありがとうございました!