flutterアプリでCloud Firestoreにデータを保存する時の方法について、本ページで記載します。
Cloud Firestoreを使うにはまず別のページで紹介している初期設定が必要になります。
そちらの設定がまだの方はまずページを参照し初期設定を行ってください。
Cloud Firestoreデータ保存
1. Cloud Firestoreパッケージを導入
flutterアプリのpubspec.yaml(プロジェクトフォルダ直下)に「cloud_firestore: ^0.14.2」を追加します。
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^0.1.2
firebase_core: ^0.5.1
firebase_auth: ^0.18.2
cloud_firestore: ^0.14.2
^0.14.2は記事を書いている時点の最新のバージョンなので「https://pub.dev/」のサイトでcloud_firestoreと調べて最新バージョンを確認してみてください。
2. cloud_firestoreをimport
cloud_firestoreのパッケージをソースにimportします。
対象のソースで下記のimport文を記載してください
imimport 'package:cloud_firestore/cloud_firestore.dart';
3. database作成
firebaseの対象のプロジェクトのサイトにいきます。
サイトの左の開発→Cloud Firestore→データベースの作成をクリックします。
出てきた画面で本番モードとテストモードのお好きな方を選択し、次へをクリックしてください。
テストモードでは一定期間誰でもデータベースへのアクセスが可能になっています。
今回はテストモードで進めてみます。
次のページでデータベースをどこに置くかを選択、データベースを作成します。
お好きな地域を選んでください。
4. データベースのデータ構造を定義
3の手順が完了したらデータベースに格納するデータがどのようなものなのかを定義してあげます。
作成後の画面にて「コレクション開始」をクリックします。
クリックすると以下の画面が出てきます。ここでは、RDBでいうところのテーブル名のようなものを記載し、次へをクリックします。
次に作成したデータベースに格納する項目を下記の画面で記載します。
今回はtextというString型のフィールドで値はtest
senderというString形のフィールドで値はtest@gmail.com
として保存をおし登録してみます。
データが登録されたのがわかると思います。
これをflutterのアプリから登録する方法をこれから記載していきます。
5. flutterアプリからデータ登録
はじめにfirestoreのメソッドを使うために対象の画面でfirestoreのインスタンスを作成します。
final _firestore = FirebaseFirestore.instance;
次に下記のようなメソッドでデータを登録します。
_firestore.collection("messages").add(
{"text": "登録したいデータ ", "sender": "登録したいデータ2"},
);
このように呼び出してあげることで
messagesというドキュメントにキーがtext、valueが「登録したいデータ」とkeyが「sender」、valueが「登録したいデータ2」というデータが格納されます。
Cloud Firestoreデータ取得
データ取得は簡単です。下記のようなメソッドを順番に実行していけば取得できます。
void getMessages() async {
final messages = await _firestore.collection("コレクション名").get();
for (var message in messages.docs) {
print(message.data());
}
}
この実装ではコレクション名で指定したコレクションにあるデータを全て取得し、consoleに順番に出力しています。
ただし、上記は対象のgetMessages関数が実行されるまではデータ取得を行わないため、例えば、チャットのように他のユーザがメッセージを追加した場合、検知ができません。
firestoreにデータが追加された場合にメッセージの取得が実行されるようにするためには下記のようにsnapshotsメソッドを使用します
void messagesStream() async {
await for (var snapshot in _firestore.collection("コレクション名").snapshots()) {
for (var message in snapshot.docs) {
print(message.data());
}
}
}
コメントを書く