Blog

Swift Firebase トランザクション delete

Firebaseのリレーションで関連づいているモデルのdelete(削除)について説明します。

ポイント

  1. トランザクションを利用する
    1. Firebaseはカスケードなどの概念がなく、それぞれの子モデルを削除する処理を使わないといけない。
    2. runTransactionメソッドを利用する
  2. 関数を用意してくほうが良い deleteCollectionWithSubcollections
  3. SubCollectinは複数取得されるので、forEachでループですべて処理しておく
import FirebaseFirestore

// Firestoreのインスタンスを取得
let db = Firestore.firestore()

// サブコレクションとコレクションを同時に削除する関数の例
func deleteCollectionWithSubcollections(collectionPath: String, completion: @escaping (Error?) -> Void) {
    db.collection(collectionPath).getDocuments { (querySnapshot, error) in
        if let error = error {
            completion(error)
            return
        }

        // トランザクションを実行
        db.runTransaction({ (transaction, errorPointer) -> Any? in
            // メインコレクション内の全てのドキュメントを削除
            //querySnapshotはsubCollectionで複数ある
            querySnapshot?.documents.forEach { document in
                // サブコレクションも削除
                let subCollectionRef = document.reference.collection("サブコレクション名")
                subCollectionRef.getDocuments(completion: { (subQuerySnapshot, subError) in
                    if let subError = subError {
                        errorPointer?.pointee = subError as NSError
                        return
                    }

            //subcollectionは複数あるのですべて処理しておく
                    subQuerySnapshot?.documents.forEach { subDocument in
                        transaction.deleteDocument(subDocument.reference)
                    }

                    // メインドキュメントを削除
                    transaction.deleteDocument(document.reference)
                })
            }

            return nil
        }) { (_, error) in
            if let error = error {
                completion(error)
            } else {
                completion(nil)
            }
        }
    }
}

// 使用例:コレクションとそのサブコレクションを削除する
let collectionPath = "コレクション名"
deleteCollectionWithSubcollections(collectionPath: collectionPath) { error in

    //オプショナルバインディング
    if let error = error {
        print("トランザクションエラー:", error.localizedDescription)
    } else {
        print("Transaction complete.")
    }
}

このSwiftのコードは、Firebase Firestoreで指定したコレクションとそのサブコレクションを同時に削除する処理を行います。

deleteCollectionWithSubcollections関数は、指定されたコレクションに対してトランザクションを使用してドキュメントを削除します。

削除が成功した場合は “Transaction complete.” が、エラーが発生した場合は “トランザクションエラー:” とエラーメッセージが出力されます。


一つ前の記事 TVとYoutubeについての考察
次の記事 海外WEBマーケティング 市場調査・現状分析について