🐠
Firestoreのデータをコピーしてから、更新したい
残したいデータがあるときはどうするの?
Firestoreのデータをupdateを使用して、更新するときにすでに作っているコレクションの特定のフィールドのデータを使いたい場合があります。
何もせずに、そのままupdateを実行すると、入力したデータしか保存されず、データが上書きされて、入力されなかったデータの入っているフィールドは消えてしまいます😱
ここで参照型を使用する
Firebaseの機能で、reference型なるものがあります。こちらを使うと、すでに存在しているコレクションのフィールドから、保存しているデータをとってきて、更新をするときに、データを保存することができます。
こんな感じのコードです
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_auth/firebase_auth.dart';
class TaskSample {
final auth = FirebaseAuth.instance;
final db = FirebaseFirestore.instance;
final updatedAt = Timestamp.now();
Future<void> updateTask(String taskName, bool isDone) async {
try {
final uid = auth.currentUser?.uid;
/// [tasksコレクションにアクセスする]
final DocumentReference taskRef = db.collection('tasks').doc(uid);
/// [reference型でデータを参照する]
final DocumentSnapshot doc = await taskRef.get();
int count = doc['count'] ?? 0; // countフィールドをコピーする
String personName = doc['personName'] ?? ''; // personNameフィールドをコピーする
/// [Map型の変数に引数と変数を入れる]
Map<String, dynamic> data = {
'taskName': taskName,
'isDone': isDone,
'count': count,
'personName': personName,
'updatedAt': updatedAt,
};
/// [データを更新する処理を実行する]
taskRef.set(data);
} catch (e) {
throw e;
}
}
}
まとめ
なんでのこの記事を書いたのかと言いますと、先週、Flutterのハッカソンに出場したときに、データをコピーする方法がないかと、言われてそのときは、上のコードのようなロジックは使いませんでしたが、やったことなかったので、試してみたいなと思い個人アプリで試してみて、できたのでドキュメント化しようと思って記事にしました。
参照型ってあまり情報がないので、誰かのお役に立てると嬉しいです。
Discussion