realtime DB
Firebase Realtime DB の利用
最初の段階から、鎌田の準備した realtime DB の設定が織り込んだプログラムを配っています。
自分で realtime DB を立ち上げる場合の手続きを含め、firebase 自体の利用法については、クラウドDB利用の以下の説明を読んでもらうことになります。
-
- Firebase の説明および、データベース準備まで
- 自分でDBをあげないなら、特段作業はいらない。
-
- あとで、セキュリティルールの手前ぐらいまで読んでもらいます。
- 鎌田が利用したDBにアクセスする場合、ユーザアカウント情報が必要になります。
- 自分でDBを上げた場合は、パスワード認証機能を有効にし、アカウントを追加してもらうことになります。
Database へのアクセス
基本は、こちらのチュートリアルにそって勉強してもらうことになりますが、 ここでは、データの読み取りと書き込みのあたりだけ扱います。
-
DatabaseReferene を取得する
- 公式チュートリアル該当部
- 配布プログラムの該当箇所
- ネットワーク設定済みなら、DatabaseReference の取得をおこなうようにしているだけです。
-
データを書き込む
- 公式チュートリアル該当部
- 配布プログラムの該当箇所
- 今回は、
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
相当を取り込んで、CustomView
にsetShapes()
すること。 - DB からのデータ取得は、非常に時間がかかるかもしれないので、データが帰ってきたときの処理を登録します。こういうのを Callback 関数と呼びます。
- 今回は、結果が
task
に入っているので、まずは成否を確認後、成功&値が入っていたら、setShapes()
を呼び出しています。
- 達成したいのは、ボタンを押されたら、DBの該当部分から
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
のようなグラフィック情報を含んだものは失敗します。
- 例えば、色を保存するなら Color を表す int や
- 対象クラスは、無引数の 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アプリ」を追加しないといけません。
- Firebase コンソールの左上「プロジェクトの概要」に移り、「アプリを追加」をおこないます。
- Android を選択し、Android パッケージ名は
konanU.kamadaG.sample
などと登録してください。 - 構成ファイルをダウンロードして追加の指示にしたがって、「Project Files の画面」で
app
以下のgoogle-service.json
をダウンロードしたものと差し替えてください。 - 登録手続きを最後まですすめます(gradle 設定はすでに完了しているので、特に作業はいらないはず)
- プロジェクトをBuildしましょう。