🐶
Cloud Firestoreの自動ドキュメントIDを取得してデータを削除する
Cloud Firestore登録データの削除機能を作るため公式ドキュメントを見たが
いや、「DC」なんてドキュメントIDのドキュメントを登録していないのだが・・・
db.collection("cities").doc("DC").delete().then(
(doc) => print("Document deleted"),
onError: (e) => print("Error updating document $e"),
);
自動ドキュメントIDを取得して削除はできないのか
Cloud Firestoreにデータを登録するときはドキュメントIDが自動で割り当てられる。ランダムな英字20桁くらいのものだ。
試しにRecipeクラスのオブジェクトrecipeに.idをつけてみたが、「そんなgetterありません」と言われてしまった。自動で取得できるんじゃないの?
ちなみにrecipe.nameだとちゃんとレシピ名が取得できる状態なのでオブジェクトの問題ではなさそう・・・
try {
final db = FirebaseFirestore.instance;
await db.collection('recipe').doc(recipe.id).delete();
Navigator.of(context).pop();
Navigator.of(context).pop();
} catch (e) {
print(e);
}
flutter: NoSuchMethodError: Class 'Recipe' has no instance getter 'id'.
答え
Recipeクラスの方にidフィールドを追加したらrecipe.idでドキュメントIDが取得できるようになりました。
わかってしまえば「なんだ、そんなことか〜」という感じですが、意外と参考情報がなかったので共有しておきます。
Recipe.dart
import 'package:cloud_firestore/cloud_firestore.dart';
class Recipe {
// ↓id要定義
final String id;
final String uid;
final String name;
final Timestamp date;
final String picture;
final int category;
final int style;
Recipe({
// ↓id要定義
required this.id,
required this.uid,
required this.name,
required this.date,
required this.picture,
required this.category,
required this.style,
});
factory Recipe.fromFirestore(DocumentSnapshot doc) {
final data = doc.data() as Map<String, dynamic>;
return Recipe(
// ↓id要定義
id: doc.id,
uid: data['uid'],
name: data['name'],
date: data['date'],
picture: data['picture'],
category: data['category'],
style: data['style'],
);
}
}
Discussion
DocumentIDを取得する方法それは、DocumentSnapshotを使うこと。withConverter使ったら楽ですけどね。やり方は色々。
snapshotの中に、idが存在する。
私なら、こんな感じで削除のロジックを書きますね。
View側で、DocumentIDを取得すれば、削除はできますね。モデルクラス作って、メンバー変数のidを渡せば、指定できます。withConverter使えば編集のfunctionにidを渡して、別のページで更新もできるかな。
コンストラクターで編集ページへDocumentIDを渡す。
全体のコード
ご興味あれば試してみてください。
ありがとうございます!