FirebaseをAndroidアプリで操作する


FirebaseのデータにアクセスするAndroidアプリを作成した結果を備忘録として投稿します。

# Firebaseとは
[Firebase](https://www.firebase.com)は、Googleが提供しているBasSサービスです。リアルタイム通知可能、かつアクセス制御可能なオブジェクトデータベース機能に加え、認証機能も持っています。

ブラウザ(Web), モバイルアプリ(iOS, Android)からFirebaseのデータにアクセスすることができます。

Firebaseの使い方は以下のサイトを参考にしてください。
* [Fireabse Developer Docs](https://www.firebase.com/docs/)
* [リアルタイム・バックエンドサービス「Firebase」を使ったWebアプリ作成 | infoScoop開発者ブログ](https://www.infoscoop.org/blogjp/2015/01/24/realtime-app-firebase/)

# Androidアプリ
[Android Quickstart - Firebase](https://www.firebase.com/docs/android/quickstart.html)を参考にして、FirebaseにアクセスするAndroidアプリをAndroid Studioを使って作成しました。

## 手順
1. Firebaseアプリを作成します
2. Android Studioで新規プロジェクトを作成します 
3. Firebase clientライブラリをインストールします
4. Android permissionを追加します
5. Firebaseへのアクセス処理を追加します

## Firebaseアプリ作成
[リアルタイム・バックエンドサービス「Firebase」を使ったWebアプリ作成 | infoScoop開発者ブログ](https://www.infoscoop.org/blogjp/2015/01/24/realtime-app-firebase/)を参考に、Firebaseアプリを作成してください。

## Androidアプリ用新規プロジェクト作成
File-New-New Projectから新規プロジェクトを作成します。Activityを作れるならばどのタイプのテンプレートでもOKです。

## Firebase clientライブラリのインストール
Android Atudioでプロジェクトに組み込まれているbuild.grandleを編集します。

```
dependencies {
　　...
   compile 'com.firebase:firebase-client-android:2.0.3+'
}
```
ビルドエラーになるので以下の記述も追加します。

```
android {
    packagingOptions {
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE-FIREBASE.txt'
        exclude 'META-INF/NOTICE'
    }
    ...
}
```
## Android permissionを追加
AndroidManifest.xmlにインターネット接続用パーミッションを追加します。

```
    <uses-permission android:name="android.permission.INTERNET" />

```

## Firebaseへのアクセス処理を追加します
Activity.onCreateにFirebaseアクセス処理を追加します。

```java
    private Firebase mFirebaseRef;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // クライアントライブラリにコンテキスト(Activity)をセットします。
        Firebase.setAndroidContext(this);

		 // Firebaseアプリへの参照を取得します
        mFirebaseRef = new Firebase(FirebaseアプリのURI);

        // 操作対象の参照を取得します         
        Firebase child = mFirebaseRef.child(データパス);
}
```


### データ取得
操作対象に対してaddValueEventListenerを追加します。追加した時点でonDataChangeが呼び出されます。2回目以降は、対象データが変更されると呼び出されます。

```java
    child.addValueEventListener(new ValueEventListener() {

        @Override
        public void onDataChange(DataSnapshot snapshot) {
            // snaphost.getValue()でデータを参照する。
        }

        @Override
        public void onCancelled(FirebaseError error) {
        }

    });

```
getValueしたデータは、HashMap形式になっています。
![Snapshot_getValue.png](https://qiita-image-store.s3.amazonaws.com/0/5247/0bf5b6f4-8daf-9c5e-94df-e6dcd81706f8.png "Snapshot_getValue.png")

### データセット
setValueでデータを追加します。値がnullの場合には項目が削除されます。Listerner登録しておくとセットした結果が通知されます。

```java
    Map<String, String> data = new HashMap<String, String>();
    data.put("content", "Hello");
    child.setValue(data, new CompletionListener() {
        public void onComplete(FirebaseError error, Firebase ref) {
        };
    });
```

### ユーザ認証
Firebaseのデータはデフォルトで誰でも読み書き可能になっています。Ruleを追加することによってアクセス制御することができます。アクセス権がないデータにアクセスするとFirebaseError(Permission error)になります。アクセス制御は以下のページを参照してください。

[FirebaseのRulesを理解する - Qiita](http://qiita.com/laco0416/items/b068ab0cf19a26f0992d)


## アプリ実行
Androidアプリはemulator上からもFirebaseにアクセスできます。