🐠

Firestoreのデータをコピーしてから、更新したい

2023/04/20に公開

残したいデータがあるときはどうするの?

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