DocumentIDとは???
📕Overview
DocumentSnapshotには、FirebaseFirestoreデータベース内のドキュメントから読み取られたデータが含まれています。
データは、data プロパティを使用して抽出するか、添え字構文を使用して特定のフィールドにアクセスすることによって抽出できます。
id -> String
このスナップショットに対してこのドキュメントに指定された ID。
🧷summary
Firestoreを使ったアプリで、CRUD処理を実装したいことがある。編集と削除をするときに、.doc(uid)
を使うことが多いのですがこれだと、特定のユーザーが作ったデータ1個しか編集と削除をできません!
複数のデータを.add
で作るユースケースがあります。この場合だと、ランダムなドキュメントIDが生成されて保存されます。アルファベット大文字小文字と数字からなる20行の文字列です。
こんな感じかな...
GoPdXIyV5SPcGak92MGm
ドキュメントIDを取得するには、公式にも書いてありますが、DocumentSnapshotにはのdataプロパティを使います。これを格納した変数を使って、.
で繋げるとidを取得できます。
こんな感じか?
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:todo_app/domain/todo.dart';
// todoコレクションを操作するwithConverter
final todoWithConverter = FirebaseFirestore.instance
.collection('todo')
.withConverter<Todo>(
fromFirestore: (snapshot, _) {
final data = snapshot.data()!;
data['id'] = snapshot.id;
return Todo.fromJson(data);
},
toFirestore: (todo, _) => todo.toJson(),
);
withConverterと呼ばれる機能を使うと、データ型を型安全に扱うことができます。どうゆうことだって話ですけどね。モデルクラスのidはStringだけど、これをfunctionのargmentsに渡してもエラーが出ます。
data()で、スナップショットを取得しないと、DocumentIDは取れないようです。
スナップショットってのは、専門用語によると、ファイル、ディレクトリ、データベースファイルなどの状態を抜き出したものだそうです。
まあ、View側で取得して、渡すこともできますけどね。昔書いたコードだとこんな感じかな...
IconButton(
onPressed: () async {
final id = document.reference.id;
await service.deleteMemo(id);
},
icon: const Icon(Icons.delete))
withConverterのidのところをsnapshot.reference.id
にしても良い。
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:todo_app/domain/todo.dart';
// todoコレクションを操作するwithConverter
final todoWithConverter = FirebaseFirestore.instance
.collection('todo')
.withConverter<Todo>(
fromFirestore: (snapshot, _) {
final data = snapshot.data()!;
data['id'] = snapshot.reference.id;
return Todo.fromJson(data);
},
toFirestore: (todo, _) => todo.toJson(),
);
🧑🎓thoughts
今回は、ランダムに生成されたDocumentIDの使い方について解説しました。CRUDできるアプリのサンプルコードも公開してるので、ご興味ある方は試してみてください。
こちらが完成品
参考にした書籍。ただしこれは、Vue.jsでWebアプリを作るものなので、設計とか認証・認可をFirebaseを使ってやってる仕組みについて学ぶものです。私は参考になったかな。
Discussion