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