イー・エージェンシーはマーケティングデータ活用でビジネス課題を解決するプロフェッショナル

【Firebase】Cloud Firestoreをアプリから使用する方法

この記事をシェア

Cloud Firestore を使ってみる

Cloud Firestore データベースへのデータの追加や検索を、プログラムから実行する方法について説明します。
Firestore のデータ構造は、コレクション/ドキュメント/データから構成されています。
コレクションの中に、複数のドキュメントが格納でき、各ドキュメントの中にデータを格納します。
これらは階層構造になっています。

コレクション    例. Users
  ┗ ドキュメント  例. ユーザ1
    ┗ データ
  ┗ ドキュメント  例. ユーザ2
    ┗ データ

実装

Android での実装方法について説明します。
アプリレベルの build.gradle に依存関係を追加します。

implementation 'com.google.firebase:firebase-firestore:21.1.1'

FirebaseFirestore インスタンスの取得

最初に、今後の処理で必要となる FirebaseFirestore インスタンスを取得しておきます。

private FirebaseFirestore firestore;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    firestore = FirebaseFirestore.getInstance();

セキュリティルール

Firestore をアプリからアクセスするにあたって、セキュリティルールを設定する必要があります。
セキュリティルールは、Firestore の各ドキュメントへのアクセス可否を設定します。
Firebase コンソールを開き、画面左のメニューから「Database」を選択して下さい。
(始めて使う場合は、データベースの作成を行って下さい。)
「Cloud Firestore」を選択し、「ルール」タブを選択します。

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

例えば、セキュリティルールを上記のように設定した場合、全てのドキュメントが読み書き可能になります。
これはセキュリティ的に最も弱い状態ですので、本番時は適切に設定する必要があります。

データの追加

いったん上記のセキュリティルールのままで、データを追加してみます。

CollectionReference collRef = firestore.collection("collection1");

Map<String, Object> data = new HashMap<>();
data.put("name", "やまだ");
data.put("age", 18);

Task<DocumentReference> task = collRef.add(data);
task.addOnCompleteListener(this, new OnCompleteListener<DocumentReference>() {
    @Override
    public void onComplete(@NonNull Task<DocumentReference> task) {
        if (task.isSuccessful()) {
            Log.d(TAG, "data add success " + task.getResult().getId());
	} else {
            Log.d(TAG, "data add failed", task.getException());
        }
    }
});

Firestore インスタンスから、CollectionReference を取得します。
追加したいデータを連想配列として作成し、add メソッドに渡しています。
上記の処理において、コレクション名として “collection1” を指定しています。
コレクションが存在しない場合は、データが作られる際に、指定した名前のコレクションが作られます。
また、ドキュメントもランダムな名前のものが自動的に作られます。

データの検索

コレクションからデータを検索する場合、例えば以下のようにします。

CollectionReference collRef = firestore.collection("collection1");

Query query = collRef.whereGreaterThan("age", 10);

Task<QuerySnapshot> task = query.orderBy("age", Query.Direction.DESCENDING).limit(10).get();

task.addOnCompleteListener(this, new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task)  {
        if (task.isSuccessful()) {
            QuerySnapshot querySnapshot = task.getResult();
            for (DocumentSnapshot doc : querySnapshot) {
                Log.d(TAG, "data get success " + doc.getId());
            }
	} else {
            Log.d(TAG, "data get failed", task.getException());
        }
});

whereGreaterThan メソッドで、クエリを作っています。
指定した値より大きいデータを取得します。
他に、whereEqualTo メソッドなどもあります。

Firebase Authentication で認証したユーザのデータを記録する

以前、Authentication によるユーザの作成と認証について書きましたが、ユーザを作成した後に、Firestore にユーザ情報を記録するには以下のようにします。

FirebaseUser currentUser = auth.getCurrentUser();
CollectionReference collRef = firestore.collection("Users");
DocumentReference docRef = collRef.document(currentUser.getUid());

Map<String, Object> user = new HashMap<>();
data.put("name", "やまだ");
data.put("age", 18);

Task<Void> task = docRef.set(user);
task.addOnCompleteListener(this, new OnCompleteListener<Void>() {
    @Override
    public void onComplete(@NonNull Task<Void> task) {
        if (task.isSuccessful()) {
            Log.d(TAG, "user set success");
        } else {
            Log.d(TAG, "user set failed", task.getException());
        }
    }
});

ユーザのUIDをドキュメントのIDに指定して、DocumentReference を取得しています。
この参照に対して set メソッドを呼び出すことによって、データを追加します。
もし同じIDのドキュメントがすでに存在する場合、その中のデータは削除されて、新しいデータが追加されます。
データを更新したい場合は、set(user, SetOptions.merge()) のようにするか、もしくは update メソッドを使います。

セキュリティルール

ユーザ情報を Firestore に記録しましたが、自分のユーザ情報は自分のみが読み書き可能になるようにセキュリティルールを設定することで、セキュリティを強化することができます。

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /Users/{userId} {
      allow read write: if request.auth.uid == userId;
    }
  }
}

例えば、上記のようにすることで、Firebase Authentication にログインしている場合にだけ、自分のデータを読み書きできます。

いかがでしたか?イー・エージェンシーでは、Google アナリティクス 360 やサポートをご契約のお客様を対象に、Google アナリティクス for Firebase の導入支援を行っております。
また、アプリとWebのクロスプラットフォーム分析ができるGoogle アナリティクス 4 プロパティ(GA4)の導入支援も行っております。
まずは下記よりお気軽にお問い合わせください。

Google アナリティクス for Firebase ・Google アナリティクス 4 プロパティ(GA4) の導入に関するお問い合わせはこちら

この記事をシェア

この記事を書いた人

アバター

広報・PR・マーケティング担当

このライターが書いた記事を見る

私たちは、データを活用した成果貢献のための支援を行っております。
サービスについてお気軽にご相談・お問い合わせください。

資料ダウンロード

デジタルマーケティングに活用いただける様々な資料を
ダウンロードいただけるようご用意しました。

ご相談・お問い合わせ

私たちは、貴社のビジネス成長のためのデータ活用を支援いたします。
支援内容についてはお気軽にご相談・お問い合わせください

このページの先頭へ