【Swift/Firebase】Realtime Databaseで条件を満たす複数のデータを一括削除する方法!

この記事からわかること

  • Swift/FirebaseRealtime 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] )

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index