Chapter 32

Firebase編3:Firestore

kazutxt
kazutxt
2021.05.15に更新

このチャプターでは、FirebaseのDBであるFireStoreについて解説します。

GUI/Flutterからコレクション/ドキュメント/フィールドを操作する方法を解説します。

概要

Cloud Firestore Database(以下Firestore)はスケーラビリティに優れたNoSQLのDBを提供します。

NoSQLは行列のリレーショナルデータベースをSQLで制御するのではなく、自由なデータ構造を持つDBを制御する方式をいいます
FirebaseにはSQLで制御するリレーショナルデータベースのサービスは提供されていません

Firestoreにはわかりやすい動画があるので、こちらを見ていただくのも良いかと思います

https://www.youtube.com/watch?v=v_hR4K4auoQ&list=PLl-K7zZEsYLluG5MCVEzXAQ7ACZBCuZgZ&index=1

FiresotreとRealtimeDatabase

Firebaseには2つのデータベースが準備されています。
特別な理由がなければ、後発のFirestoreを選択すれば問題ありません。
詳しく違いを確認したい方は下記を参照いただくと良いと思います。

https://firebase.google.com/docs/database/rtdb-vs-firestore?hl=ja

コレクション、ドキュメント、フィールド

Firestore(NoSQL)には決まった構造がありません。
Firestoreでは、コレクション/ドキュメント/フィールドというデータを組み合わせて構造を作っていきます。

  • フィールドは、key-valueで実際の名前とデータを持ちます。
  • ドキュメントは、フィールドを複数持ちまとめるものです。再帰構造を作るためにコレクションも持てます。
  • コレクションは、ドキュメントをまとめたもので、コレクションの直下にフィールドは持てません。
コレクション
  L ドキュメント
    L フィールド
  L ドキュメント
    L フィールド
    L フィールド
  L ドキュメント
    L フィールド
    L コレクション
      L ドキュメント
         L フィールド
ユーザリスト
  L ユーザA
     L 所属:○○会社
  L ユーザB
     L name:田中
     L age:20
  L 共通
     L 属性:リードオンリー
     L 設定リスト
      L プロパティ
         L ランク:A

有効化手順

Firesotreの有効化は、Firebaseの左側のメニューのFirestore Database > データベースの作成のボタンをクリックします。

GUIからの操作

Flutterから操作する前に、ブラウザのダッシュボードから直接操作をしてイメージを掴んでみましょう。

コレクションとドキュメントの追加

コレクションとドキュメントを追加します。

フィールドの追加

フィールドを追加します。

ドキュメントの追加と削除

ドキュメントの追加と削除します。

サブコレクションの追加

サブコレクションの追加をします

Flutterからの操作

Firebaseのパッケージは変更が早いため、メソッドが非推奨になったり振る舞いが変わったりすることがあります。
下記で期待する動きにならなかった場合は最新のドキュメントなどをご確認ください

まず、Flutterにパッケージを入れます
firebase_corecloud_firestoreの2つが必要になります。

pubspec.yml
firebase_core: ^1.0.2
cloud_firestore: ^1.0.3

コレクションへのアクセス

コレクションにアクセスするcollectionとドキュメントにアクセスするdocを組み合わせてアクセスします。

db.dart
// 通常のアクセス
FirebaseFirestore.instance
  .collection('testCollection1')
  .doc('testDocument1')
  .get()
  .then((ref) {
    print(ref.get("testField1"));
});

パラメタなどを動的にパスを作る場合は、docにパスをまとめて記載するのが便利です。

db.dart

//  docにパスをまとめて書くアクセス。サブコレクションにアクセス
FirebaseFirestore.instance
  .doc('testCollection1/testDocument1/testSubCollection1/testSubDocument1')
  .get()
  .then((ref) {
    print(ref.get("testField1"));
});

コレクションの追加/変更/削除

追加や更新の例

db.dart
// 追加と更新
FirebaseFirestore.instance
  .doc('autoCollection1/autoDocument1')
  .set({'autofield': "abcd"});
  
// addによるドキュメントIDを指定しない追加
// この場合は、ドキュメントIDはハッシュ値が払い出されます
FirebaseFirestore.instance
  .collection('testCollection1')
  .add({'autofield': "xyz"});

削除の例

db.dart
// 削除
FirebaseFirestore.instance
  .doc('autoCollection1/autoDocument1')
  .delete();

参照だけを取得した上で、後で値を取得する例

db.dart
// 参照だけを取得
// CollectionReferece
CollectionReference collection =
  FirebaseFirestore.instance
    .collection('testCollection1');
// DocumentReference
DocumentReference document = 
  FirebaseFirestore.instance
    .collection('testCollection1')
    .doc("testDocument1");

set時の注意

db.dart
//下記のようにしないと、setするたびに過去のデータが消えるので、前データを残したい場合はmergeオプションを付けます
set(data,SetOptions(merge: true));