【Swift/Firebase】Realtime Databaseで条件を満たす複数のデータを一括削除する方法!
この記事からわかること
- Swift/FirebaseのRealtime Databaseで条件を満たす複数のデータを一括で削除する方法
- removeValueメソッドupdateChildValuesの使い方
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Swiftを使ってのFirebaseのRealtime Databaseの導入方法や操作については下記記事を参考にしてください。
removeValueメソッド
Realtime Databaseに格納しているデータを削除するにはremoveValue
メソッドを使用します。
このメソッドを使用することで指定した箇所以下の階層にあるデータを全て削除することができます。
ref.child("users").removeValue()
しかしこのメソッドでは一度に複数箇所のデータを削除することはできません。一度に複数箇所のデータを削除(更新)するにはupdateChildValues
メソッドを使用します。
updateChildValuesメソッド
updateChildValuesメソッドは指定した階層のデータのみを更新するメソッドです。このメソッドでは引数に辞書型で更新したい箇所を複数渡すことが可能になっています。
guard let key = ref.child("posts").childByAutoId().key else { return }
let post = ["uid": userID,
"author": username,
"title": title,
"body": body]
let childUpdates = ["/posts/\(key)": post,"/user-posts/\(userID)/\(key)/": post]
ref.updateChildValues(childUpdates)
このメソッドで渡す値をnil
にすることでその階層のデータを削除することができるのでこの仕組みを利用して一度にデータを削除する処理を構築していきます。
条件を満たす複数のデータを一括削除する方法
複数箇所のデータを一度に削除するためにはそこまでのパスをキー値として保持する辞書型を生成します。値をnil
にしておけば対象のデータを削除することが、任意の値を渡せば一括で更新することができるようになります。
また条件を満たすものを削除したい場合DBからデータを取得後にswiftで扱いやすいように[構造体]
形式などに変換後、filterメソッドで条件を絞り、以下のように動的に配列を作成することで実装できました。
let items = users.filter({$0.ios == true})
var removeItems:[String:Any?] = [:]
for item in items {
removeItems.updateValue(nil, forKey: item.id)
}
ref.child("users").updateChildValues(removeItems as [AnyHashable : Any] )
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。