techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

FirebaseのRealtime Databaseを利用してみる 〜その1〜

FirebaseのRealtime Databaseを利用してみました。と言っても、まだデータを登録しただけなので、導入編といった感じです。

Realtime DatabaseはFirebaseがクラウド上に提供するNoSQL型のデータベースです。
今回はこのRealtime Databaseを利用して、データを保存するところまでやってみました。

特徴

公式ドキュメントをオレオレ翻訳した限りでは、Realtime Databaseは以下のような特徴を持っています。

  • データはKey-Value形式でストアし、JSON形式でサーバ上に永続化される。
  • データはクライアントが接続されたタイミングでリアルタイムに同期される。
  • クロスプラットフォームアプリ開発を行うとき、各クライアントは一つのデータベースインスタンスを共有する。
  • データの変化を検出し、自動的に最新のデータで同期する
  • オフライン状態にあるときでもデータを維持してオンライン時に同期できる
  • セキュリティルールやバリデーションルールを設定できる。

というわけで、これから確認していきたいと思います。今回は一つ目です。

準備

まずは準備します。
Analyticsを試した時と同じようにアプリケーションをFirebaseに登録します。
上記リンク先の「Firebase Analyticsの利用準備」まで進めたら、build.gradle(app)に以下の記述を追記します。

compile 'com.google.firebase:firebase-database:9.2.1'

データの登録

早速データを登録してみます。
ユーザのデータと見立てて、Emailとパスワードを登録してみます。

    private void submit(String email, String password) {
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference refEmail = database.getReference("email");
        refEmail.setValue(email);

        DatabaseReference refPassword = database.getReference("password");
        refPassword.setValue(password);
    }

2行目でFirebaseDatabaseのインスタンスを取得し、3行目(Email)と6行目(パスワード)でデータベースへの参照を取得しています。
そして4行目と7行目でsetValueを呼び、値をデータベースに即時登録しています。
登録されたデータはFirebaseのコンソールですぐに確認できます。
f:id:uentseit:20160723212921p:plain

setValueメソッドの引数はObject型で、JSONでサポートされている型であればsetValueで登録できます。

    private void submitSomeTypes() {
        FirebaseDatabase database = FirebaseDatabase.getInstance();

        HashMap<String, String> map = new HashMap<String, String>();
        map.put("key1","val1");
        map.put("key2","val2");
        ArrayList<String> list = new ArrayList<String>();
        list.add("item1");
        list.add("item2");
        database.getReference("boolean").setValue(true);
        database.getReference("Long").setValue(1L);
        database.getReference("Double").setValue(1.1D);
        database.getReference("Map").setValue(map);
        database.getReference("List").setValue(list);
    }

f:id:uentseit:20160723213006p:plain

また、setVaueにnullをセットするとkey-valueのペアを消すことができます。

    deleteItem("List");
    ・・・
    private void deleteItem(String key) {
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        database.getReference(key).setValue(null);
    }

登録していたはずの"List"が消えています。 f:id:uentseit:20160723213239p:plain

さらに、以下の条件を満たすクラスであれば、そのクラスのインスタンスを引数に指定することができます。
1. 引数なしのデフォルトコンストラクタを持っていること
2. 定義されたプロパティはpublicなgetterメソッドを持っていること。
試しにDataBindingするために作った以下のUserDataクラスを登録してみます。

public class UserData extends BaseObservable {
    String email;
    String password;

    public UserData() {
    }

    @Bindable
    public String getEmail() {
        return email;
    }

    @Bindable
    public String getPassword() {
        return password;
    }

    public void setEmail(String textInput) {
        this.email = textInput;
    }

    public void setPassword(String textInput) {
        this.password = textInput;
    }

}
    submit(userData);
    ・・・
    private void submit(UserData userData) {
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference refEmail = database.getReference("user");
        refEmail.setValue(userData);
    }

Firebaseのコンソールで見てみると以下のようになります。
f:id:uentseit:20160723213318p:plain

データが登録されない?

Realtime Databaseは、デフォルトで下図のようにセキュリティルールがセットされています。
f:id:uentseit:20160723213348p:plain
まだあまり調べてませんが、ぱっと見、データの読み書きするをするためには認証が必要ということを言っているっぽいです。
このままではデータの登録ができないので、一旦以下のように直接編集し、認証を不要にしておきます。
f:id:uentseit:20160723213512p:plain
またこの辺りは追々調べていきます。