Firebaseを使った
Androidアプリ開発
2015-10-10 @GDG Tokyo Meeting
自己紹介
• 白山 文彦
• 株式会社マナボ 技術者
• @fushiroyama
• http://blog.shiroyama.us/
• http://qiita.com/FumihikoSHIROYAMA
Firebaseとは
• リアルタイム同期型クラウドデータベース
• JSONストア型NoSQL
• データの柔軟なセキュリティアクセス制限
• オフラインサポート
• Twitter, Facebook, GitHub, Google などのアカウ
ント認証と容易...
中央サーバ
ローカルコピー ローカルコピー
• アプリはJSONをツリーとみなし任意の位置を参照
(reference)する
• 参照した位置から読みだしたり書き込んだりする
• データはすぐさま同期される(400ms前後)
• オフライン状態でも書き込み・読み出し可能(なよ
うに見える...
何が出来るかデモ
• リアルタイムな同期!
• オフラインで書き込み、オンライン復帰時に同期
• オンライン復帰時にも書き込んだ時間順に並ぶ
Signup
https://www.firebase.com/signup/
Android Quickstart
build.gradle
dependencies {
compile 'com.firebase:firebase-client-android:2.4.0+'
}
build.gradle
android {
...
packagingOptions {
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE-FIREBASE.txt'
exclude '...
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
CustomApplication
@Override
public void onCreate() {
super.onCreate();
Firebase.setAndroidContext(this);
// other setup co...
Activity
Firebase myFirebaseRef = new Firebase("https://<YOUR-FIREBASE-
APP>.firebaseio.com/");
Create Reference
Writing Data
myFirebaseRef.child("message")
.setValue("Do you have data? You'll love Firebase.");
Child
Node
key
write!
Reading Data
myFirebaseRef.child("message").addValueEventListener(new ValueEventListener() {
@Override
public void onDataC...
• Firebaseアプリ開発はイベントドリブンモデル
• 任意のキーを参照し、受け取りたいイベントリスナを設定して
いく
• 保存は Firebase#setValue(Object)
• ObjectはいわゆるPOJO(フィールド名がキーに...
有効なデータ型
• String
• Boolean
• Long
• Double
• Map<String, Object>
• List<Object>
• およびこれらの再帰的なデータ構造
つまりJSONで表現できる
任意のデータ型
全てはJSON。設計はプログラマに委ねられる
Arrayに注意
• 純粋なArrayは提供されない。
• ["hoge", "fuga"]は内部的に{0: "hoge", 1: "fuga"}
• 理由は並行操作を安全に行うため(添字は要素の削除で
振り直される)
• ただしArrayのよ...
色々な保存方法
• setValue()
• updateChildren()
• push()
• runTransaction()
setValue
• 一番基本的な保存方法
• キーに対応する値をそのまま子ノードも含めて上書
き保存/変更
• POJOはアノテーションとかなくてもちゃんとオブ
ジェクトとして保存できる。
エンティティを表現するPOJO
完了コールバック
updateChildren
• あるオブジェクト(ディクショナリー)一部の更新
に使う
• 例えばHashMapにたいしてsetValue()してしまう
と全てが書き換わるので、一部のkey/valueだけ更
新したいときとかに使う
ディクショナリーを取得
push
• 同じキーに同時に書き込みがあると新しい方で上書
きされる。同時に書き込みがあるチャットシステム
などではこれはマズイので、一意なキーを払い出す
仕組み。
• キーはタイムスタンプを元に作られているので時系
列でソートされる。
runTransaction
• いわゆるトランザクション
• 同時並行操作で不整合が起きるような処理をアトミッ
クに行うことが出来る
カウンタの更新のような
アトミックな操作
色々な読み出し方法
• addValueEventListener
• addChildEventListener
• onChildAdded
• onChildChanged
• onChildDeleted
• onChildMoved
addValueEventListener
• 一番シンプルな取得方法
• 指定したキー以下を全部取得
• 初回に全部取得、以後データに更新があるたびにま
た全部取得
Firebase ref = new Firebase("https://docs-examples.firebaseio.com/web/saving-data/fireblog/posts"); 

// Attach an listener ...
addChildEventListener
onChildAdded
• リストを参照しているときに子ノードが追加されると呼ば
れる
• 初回は子ノードの数だけコールバックされる
• 以後は追加されるたび、そのノードがコールバックされる
• snapShot.getKey()でそのキーを...
Firebase ref = new Firebase("https://docs-examples.firebaseio.com/web/saving-data/fireblog/posts");

ref.addChildEventListen...
onChildChanged
• onChildChangedはデータパス以下のノードが変
更されたときにコールバックされる。子ノードのど
んな子孫に対するいかなる変更でも通知される。
• onChildAddedやonChildRemoved...
onChildDeleted
• 削除されたときにコールバックされてくる。あとは
さっきのと同じ。
• コールバックに渡されるスナップショットは削除さ
れたノード。
onChildMoved
• ノードの移動で発火される。あとはさっきのとry
イベントに関する保証
• ローカルの状態変更でもこれらのイベントはトリガされる
• イベントは最終的には常にデータの正しい状態を反映する。つ
まり、ネットワークの瞬断などでローカルの操作やタイミング
が一時的にローカルデータとの差異を生んだとし...
Security
• あるキー以下のアクセス制御
• 読み込み/書き込み
• 認証済みユーザのみ書き込みなど柔軟
auth変数
• auth 変数はアクセス制御の基本
• 認証プロバイダに依らず一意保証
• auth 変数は認証処理後に生成される
User Authentication
• Facebook, Twitter, Google, GitHubなどの認証機
構と連携 (3rd Party)
• Firebase独自の認証機構 (Email & Password)
• 匿名ログイン (Anonymous)
• 自前の...
認証の有効化
ログイン処理
今日は
Email & Password Authentication
ユーザ作成
作成だけで
ログインまではしない
よくある権限
書き込みは認証ユーザ
かつログイン済みだけ
読み込みは認証ユーザなら
だれでもOK
その他
• Twitterの例
• https://www.firebase.com/docs/android/
guide/login/twitter.html
その他TIPS
• リスナの解除には ref.removeEventListener(originalListener);
を呼ぶ。
• 複数のリスナを登録している場合にはその分だけ全部解除を呼ん
でやる必要がある(めんどくさい・・・)
• 親...
まとめ
• オフライン機能とリアルタイム同期があるので、今まで
困っていたSocket.IO(WebSocket)などのオフライン -
> オンライン復帰時の再送みたいな処理を、複雑なコー
ドを一切書かずに実現できるのが素晴らし過ぎる。
• 並...
まとめ
• それでもなお余りある魅力!
• 是非一度評価してみてください!驚きます!
Pricing
https://www.firebase.com/pricing.html
素晴らしきサンプルたち
• https://www.firebase.com/docs/android/
examples.html
• https://github.com/firebase/AndroidChat
• https://githu...
公式リファレンスショートカット
• Quickstart
• https://www.firebase.com/docs/android/quickstart.html
• データ構造の理解
• https://www.firebase.com/d...
• アクセス制限
• https://www.firebase.com/docs/android/
guide/understanding-security.html
• 認証
• https://www.firebase.com/docs/and...
時間が余ったら
チャットアプリの実践例を
コード見ながら解説!
ご清聴ありがとうございました。
• 本日の資料
マナボはCS担当者を募集しています!
GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発
GDG Tokyo Firebaseを使った Androidアプリ開発
Upcoming SlideShare
Loading in...5
×

GDG Tokyo Firebaseを使った Androidアプリ開発

137

Published on

Firebaseを使った Androidアプリ開発@GDG Tokyo meeting - Android 最新事情 + Firebase + マテリアルデザイン

http://eventdots.jp/event/572234

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
137
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

GDG Tokyo Firebaseを使った Androidアプリ開発

  1. 1. Firebaseを使った Androidアプリ開発 2015-10-10 @GDG Tokyo Meeting
  2. 2. 自己紹介 • 白山 文彦 • 株式会社マナボ 技術者 • @fushiroyama • http://blog.shiroyama.us/ • http://qiita.com/FumihikoSHIROYAMA
  3. 3. Firebaseとは
  4. 4. • リアルタイム同期型クラウドデータベース • JSONストア型NoSQL • データの柔軟なセキュリティアクセス制限 • オフラインサポート • Twitter, Facebook, GitHub, Google などのアカウ ント認証と容易な連携
  5. 5. 中央サーバ ローカルコピー ローカルコピー
  6. 6. • アプリはJSONをツリーとみなし任意の位置を参照 (reference)する • 参照した位置から読みだしたり書き込んだりする • データはすぐさま同期される(400ms前後) • オフライン状態でも書き込み・読み出し可能(なよ うに見える。後述)
  7. 7. 何が出来るかデモ
  8. 8. • リアルタイムな同期! • オフラインで書き込み、オンライン復帰時に同期 • オンライン復帰時にも書き込んだ時間順に並ぶ
  9. 9. Signup
  10. 10. https://www.firebase.com/signup/
  11. 11. Android Quickstart
  12. 12. build.gradle dependencies { compile 'com.firebase:firebase-client-android:2.4.0+' }
  13. 13. build.gradle android { ... packagingOptions { exclude 'META-INF/LICENSE' exclude 'META-INF/LICENSE-FIREBASE.txt' exclude 'META-INF/NOTICE' } }
  14. 14. AndroidManifest.xml <uses-permission android:name="android.permission.INTERNET" />
  15. 15. CustomApplication @Override public void onCreate() { super.onCreate(); Firebase.setAndroidContext(this); // other setup code }
  16. 16. Activity Firebase myFirebaseRef = new Firebase("https://<YOUR-FIREBASE- APP>.firebaseio.com/"); Create Reference
  17. 17. Writing Data myFirebaseRef.child("message") .setValue("Do you have data? You'll love Firebase."); Child Node key write!
  18. 18. Reading Data myFirebaseRef.child("message").addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot snapshot) { //prints "Do you have data? You'll love Firebase." System.out.println(snapshot.getValue()); } @Override public void onCancelled(FirebaseError error) { } }); Child Node key read!
  19. 19. • Firebaseアプリ開発はイベントドリブンモデル • 任意のキーを参照し、受け取りたいイベントリスナを設定して いく • 保存は Firebase#setValue(Object) • ObjectはいわゆるPOJO(フィールド名がキーに対応) • とくにアノテーション不要 • データは DataSnapshot#getValue() で受け取る • キャストして使うか getValue(Class<T>) で受け取る
  20. 20. 有効なデータ型 • String • Boolean • Long • Double • Map<String, Object> • List<Object> • およびこれらの再帰的なデータ構造 つまりJSONで表現できる 任意のデータ型
  21. 21. 全てはJSON。設計はプログラマに委ねられる
  22. 22. Arrayに注意 • 純粋なArrayは提供されない。 • ["hoge", "fuga"]は内部的に{0: "hoge", 1: "fuga"} • 理由は並行操作を安全に行うため(添字は要素の削除で 振り直される) • ただしArrayのように見えるものはArrayListに自動変換 • https://www.firebase.com/docs/android/guide/ understanding-data.html 条件あり! 以下リンク参照
  23. 23. 色々な保存方法 • setValue() • updateChildren() • push() • runTransaction()
  24. 24. setValue • 一番基本的な保存方法 • キーに対応する値をそのまま子ノードも含めて上書 き保存/変更 • POJOはアノテーションとかなくてもちゃんとオブ ジェクトとして保存できる。
  25. 25. エンティティを表現するPOJO
  26. 26. 完了コールバック
  27. 27. updateChildren • あるオブジェクト(ディクショナリー)一部の更新 に使う • 例えばHashMapにたいしてsetValue()してしまう と全てが書き換わるので、一部のkey/valueだけ更 新したいときとかに使う
  28. 28. ディクショナリーを取得
  29. 29. push • 同じキーに同時に書き込みがあると新しい方で上書 きされる。同時に書き込みがあるチャットシステム などではこれはマズイので、一意なキーを払い出す 仕組み。 • キーはタイムスタンプを元に作られているので時系 列でソートされる。
  30. 30. runTransaction • いわゆるトランザクション • 同時並行操作で不整合が起きるような処理をアトミッ クに行うことが出来る
  31. 31. カウンタの更新のような アトミックな操作
  32. 32. 色々な読み出し方法 • addValueEventListener • addChildEventListener • onChildAdded • onChildChanged • onChildDeleted • onChildMoved
  33. 33. addValueEventListener • 一番シンプルな取得方法 • 指定したキー以下を全部取得 • 初回に全部取得、以後データに更新があるたびにま た全部取得
  34. 34. Firebase ref = new Firebase("https://docs-examples.firebaseio.com/web/saving-data/fireblog/posts"); // Attach an listener to read the data at our posts reference ref.addValueEventListener(new ValueEventListener() {     @Override     public void onDataChange(DataSnapshot snapshot) {         System.out.println(snapshot.getValue());     }     @Override     public void onCancelled(FirebaseError firebaseError) {         System.out.println("The read failed: " + firebaseError.getMessage());     } }); getValue(Class<T> clazz) だと型安全
  35. 35. addChildEventListener
  36. 36. onChildAdded • リストを参照しているときに子ノードが追加されると呼ば れる • 初回は子ノードの数だけコールバックされる • 以後は追加されるたび、そのノードがコールバックされる • snapShot.getKey()でそのキーを取れるので、キーのイン デックス、値のインデックスを保存しておいてListViewな どのアダプタに持っておくのはよくある運用かも
  37. 37. Firebase ref = new Firebase("https://docs-examples.firebaseio.com/web/saving-data/fireblog/posts"); ref.addChildEventListener(new ChildEventListener() { // Retrieve new posts as they are added to the database @Override public void onChildAdded(DataSnapshot snapshot, String previousChildKey) { BlogPost newPost = snapshot.getValue(BlogPost.class); System.out.println("Author: " + newPost.getAuthor()); System.out.println("Title: " + newPost.getTitle()); } //... ChildEventListener also defines onChildChanged, onChildRemoved, // onChildMoved and onCanceled, covered in later sections. });
  38. 38. onChildChanged • onChildChangedはデータパス以下のノードが変 更されたときにコールバックされる。子ノードのど んな子孫に対するいかなる変更でも通知される。 • onChildAddedやonChildRemovedと組み合わせ てよく使われる。 • コールバックには変更のあったノードの情報がスナッ プショットとして渡される。
  39. 39. onChildDeleted • 削除されたときにコールバックされてくる。あとは さっきのと同じ。 • コールバックに渡されるスナップショットは削除さ れたノード。
  40. 40. onChildMoved • ノードの移動で発火される。あとはさっきのとry
  41. 41. イベントに関する保証 • ローカルの状態変更でもこれらのイベントはトリガされる • イベントは最終的には常にデータの正しい状態を反映する。つ まり、ネットワークの瞬断などでローカルの操作やタイミング が一時的にローカルデータとの差異を生んだとしても。 • ある1人のユーザからの書き込みは常にサーバに書き込まれ、そ の後他人にブロードキャストされるという順番が守られる。 • ValueEventは常に最後にトリガされ、それより前に起こったい かなるイベントからの差分も含まれていることが保証されてい る。
  42. 42. Security
  43. 43. • あるキー以下のアクセス制御 • 読み込み/書き込み • 認証済みユーザのみ書き込みなど柔軟
  44. 44. auth変数
  45. 45. • auth 変数はアクセス制御の基本 • 認証プロバイダに依らず一意保証 • auth 変数は認証処理後に生成される
  46. 46. User Authentication
  47. 47. • Facebook, Twitter, Google, GitHubなどの認証機 構と連携 (3rd Party) • Firebase独自の認証機構 (Email & Password) • 匿名ログイン (Anonymous) • 自前の認証機構と連携 (Custom)
  48. 48. 認証の有効化
  49. 49. ログイン処理
  50. 50. 今日は Email & Password Authentication
  51. 51. ユーザ作成
  52. 52. 作成だけで ログインまではしない
  53. 53. よくある権限 書き込みは認証ユーザ かつログイン済みだけ 読み込みは認証ユーザなら だれでもOK
  54. 54. その他 • Twitterの例 • https://www.firebase.com/docs/android/ guide/login/twitter.html
  55. 55. その他TIPS • リスナの解除には ref.removeEventListener(originalListener); を呼ぶ。 • 複数のリスナを登録している場合にはその分だけ全部解除を呼ん でやる必要がある(めんどくさい・・・) • 親ノードへのリスナ登録、そしてそれを解除したからといって更 に下位のノードへのリスナが自動で解除されるわけではない。全 部登録した数だけ手動で解除する必要がある。 • 初回だけ実行されてあとは何もしないのが都合がいいリスナがあ る場合は addListenerForSingleValueEvent を使うと便利だよ。
  56. 56. まとめ • オフライン機能とリアルタイム同期があるので、今まで 困っていたSocket.IO(WebSocket)などのオフライン - > オンライン復帰時の再送みたいな処理を、複雑なコー ドを一切書かずに実現できるのが素晴らし過ぎる。 • 並行操作の制約上、純粋な配列がサポートされていな いとか、NoSQLなのでJOINが使えないとか、性質を理 解して使わないといけない部分もある。 • ちゃんと使うなら意外に高額になる?
  57. 57. まとめ • それでもなお余りある魅力! • 是非一度評価してみてください!驚きます!
  58. 58. Pricing https://www.firebase.com/pricing.html
  59. 59. 素晴らしきサンプルたち • https://www.firebase.com/docs/android/ examples.html • https://github.com/firebase/AndroidChat • https://github.com/firebase/AndroidDrawing
  60. 60. 公式リファレンスショートカット • Quickstart • https://www.firebase.com/docs/android/quickstart.html • データ構造の理解 • https://www.firebase.com/docs/android/guide/understanding-data.html • データ保存 • https://www.firebase.com/docs/android/guide/saving-data.html • データ取得 • https://www.firebase.com/docs/android/guide/retrieving-data.html • 効率的なデータ構造設計への手引き • https://www.firebase.com/docs/android/guide/structuring-data.html
  61. 61. • アクセス制限 • https://www.firebase.com/docs/android/ guide/understanding-security.html • 認証 • https://www.firebase.com/docs/android/ guide/user-auth.html
  62. 62. 時間が余ったら チャットアプリの実践例を コード見ながら解説!
  63. 63. ご清聴ありがとうございました。
  64. 64. • 本日の資料
  65. 65. マナボはCS担当者を募集しています!
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×