Cloud Firestore をアプリから使用する

0

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 にログインしている場合にだけ、自分のデータを読み書きできます。

0
タイトルとURLをコピーしました