realtime DB

Firebase Realtime DB の利用

最初の段階から、鎌田の準備した realtime DB の設定が織り込んだプログラムを配っています。

自分で realtime DB を立ち上げる場合の手続きを含め、firebase 自体の利用法については、クラウドDB利用の以下の説明を読んでもらうことになります。

  • RestAPIの利用

    • Firebase の説明および、データベース準備まで
    • 自分でDBをあげないなら、特段作業はいらない。
  • 認証&アクセス制御

    • あとで、セキュリティルールの手前ぐらいまで読んでもらいます。
    • 鎌田が利用したDBにアクセスする場合、ユーザアカウント情報が必要になります。
    • 自分でDBを上げた場合は、パスワード認証機能を有効にし、アカウントを追加してもらうことになります。

Database へのアクセス

基本は、こちらのチュートリアルにそって勉強してもらうことになりますが、 ここでは、データの読み取りと書き込みのあたりだけ扱います。

  • DatabaseReferene を取得する

  • データを書き込む

    • 公式チュートリアル該当部
    • 配布プログラムの該当箇所
      • 今回は、CustomView から Model にあたる shapes を取得して、Box (プログラム該当箇所)というクラスに詰めて保存しています。
      • Java のオブジェクトから JSON への変換はライブラリがやってくれています。
      • ただ、変換不能な属性が混じっていたときエラーにならないよう、今回は @IgnoreExtraProperties という annotation (注釈)でFirebase のライブラリに指示しています。
      • DB の shape 以下に figID 子要素として shapesを変換してものを書き込んでいます。
CustomView v = findViewById(R.id.customView);
Box shapes = new Box(v.getShapes());
DatabaseReference ref = getDB().getReference("shape");
ref.child(figID).setValue(shapes);
  • データの1回読みとり
    • 公式チュートリアル該当部
    • 配布プログラムの該当箇所
      • 達成したいのは、ボタンを押されたら、DBの該当部分からshapes相当を取り込んで、CustomViewsetShapes() すること。
      • DB からのデータ取得は、非常に時間がかかるかもしれないので、データが帰ってきたときの処理を登録します。こういうのを Callback 関数と呼びます。
      • 今回は、結果が task に入っているので、まずは成否を確認後、成功&値が入っていたら、setShapes()を呼び出しています。
Box box = task.getResult().getValue(Box.class);
  if(box != null) {
    message("loaded");
    v.setShapes(box.shapes);
  } else {
    message("fail to load");
  }

プログラム作成上の注意点

  • load/store に関連するクラスは @IgnoreExtraProperties をつけておきましょう。あと、システム提供の複雑なクラスは保存できないこともあります。
    • 例えば、色を保存するなら Color を表す int や Color クラスのオブジェクトを保存すればよく、Paint のようなグラフィック情報を含んだものは失敗します。
  • 対象クラスは、無引数の constructor が必要です。これは、DB からのデータをオブジェクト群に復元する際、ライブラリがオブジェクトを作るために使っているためなんです。

さて、公式チュートリアルの 永続リスナを使用したデータの読み取りというのを使いませんでした。 この機能は、DB側に変化があれば、随時アプリの登録リスナを実行して欲しいときに利用します。 例えば、複数人でお絵かきをしていて、別の人が図形を追加したら、すぐに最新の情報を他の人のデバイスにも反映させたいとか、そういう拡張をしたいときに利用してみましょう。

認証・セキュリティルール

DB がクラウドにあるため、誰でもアクセスできる状態だと、単に情報が盗まれるだけでなく、違法な用途に使われたら責任問題にもなります。

今回は、Email + password 認証でユーザ確認をし、加えて DB 側では認証ユーザだけが書き込めるようにしています。

ただ、関連個所があちこちあるので、個別のプログラム説明はおこないません。 DB側の設定については、 認証&アクセス制御の該当部分も見てください。

セキュリティルールについては、単にauth 済みの人はどこでも読み書きできるというのなら、以下のようなルールでOKです。

{
  "rules": {
    ".read": "auth.uid !== null", 
    ".write": "auth.uid !== null"
  }
}

書き込みは自分のuser id 以下にしか書き込めないが、読むのはどこでもOKっていうのなら、以下のようなルールになります。

{
  "rules": {
    "$uid": {
        ".write": "$uid === auth.uid"
    },
    ".read": "auth.uid !== null"
  }
}

Android アプリの登録

Android アプリから Firebase にアクセスするには、プロジェクトに「Androidアプリ」を追加しないといけません。

  1. Firebase コンソールの左上「プロジェクトの概要」に移り、「アプリを追加」をおこないます。
  2. Android を選択し、Android パッケージ名は konanU.kamadaG.sample などと登録してください。
  3. 構成ファイルをダウンロードして追加の指示にしたがって、「Project Files の画面」でapp 以下の google-service.json をダウンロードしたものと差し替えてください。
  4. 登録手続きを最後まですすめます(gradle 設定はすでに完了しているので、特に作業はいらないはず)
  5. プロジェクトをBuildしましょう。

Read more