2017-09-02 10 views
0

ユーザーが自分のアカウントを削除することを決定した場合、ユーザーが投稿したすべてのものを削除します。チャイルドに特定の値があるかどうかをチェック

だから私は彼のuserIdが含まれているすべてを削除し、データベースを通過したいと思います。

let userId = API.User.CURRENT_USER?.uid 

    API.Post.REF_POST.observeSingleEvent(of: .value) { (Post) in 

     if let dict = Post.value as? [String: Any] { 
      print("dict", dict) 


     let uid = dict["uid"] as? String 

      print(uid) 
      print(userId) 

      if uid == userId { 
       print("gefunden") 
      }else { 
       print("nichts") 
      } 

     } 
    } 

これは、nilをuidとして出力します。 私はまだすべての投稿データを印刷します。

"posts" : { 
"-Kt1h76YbyIqmSRkkLsv" : { 
    "bookmarkCount" : 0, 
    "caption" : "Helm ", 
    "characterCount" : 5, 
    "commentCount" : 0, 
    "creationDate" : 1.504357677437253E9, 
    "likeCount" : 0, 
    "photoUrl" : "https://firebasestorage.googleapis.com/v0/b/funcloud-8e84e.appspot.com/o/Posts%2F2B9606C8-E28D-4F69-9956-036192D36948?alt=media&token=2cd8712b-ca18-44a9-aa1d-d42e179a8eb7", 
    "ratio" : 1.5056179775280898, 
    "score" : -24, 
    "uid" : "hUhEPEg99HMkas6CqMXE4ZIyu472" 
}, 
"-Kt1msnhcK4sxGKi5cae" : { 
    "bookmarkCount" : 0, 
    "caption" : "", 
    "characterCount" : 0, 
    "commentCount" : 0, 
    "creationDate" : 1.50435918759132E9, 
    "likeCount" : 0, 
    "photoUrl" : "https://firebasestorage.googleapis.com/v0/b/funcloud-8e84e.appspot.com/o/Posts%2F5E96D809-AF10-4FD7-B18A-4D138DDD4878?alt=media&token=16b9452b-25da-4f7b-9d93-80e557c91490", 
    "ratio" : 0.75, 
    "score" : 0, 
    "uid" : "hUhEPEg99HMkas6CqMXE4ZIyu472" 
} 
}, 

currentUserIdが、それはまさに、そのユーザーによって投稿された意味のポストのIDを、等しくなると、私は全体のポストを削除したいです。

ありがとうございます!

答えて

0

あなたのデータベース構造は間違っています。 Firebaseは、データのフラットな表現を使用することを提案します

彼が送信する投稿のIDを含むUserの下に新しいノードを追加しようとします。

child("user/\(userId)/posts") 

そして、すべてのキーが回復のためにあなたは、データが下に含まれているすべてを削除しますたremoveValue()メソッドを呼び出すことができます。

user : { 
    userId : { 
     /* user data */ 
     posts: { 
     postId1: true // the value isn't important 
     postIdX: true 
     } 
    } 
    name : username 
} 

posts : { 
    postId1: { 
     /*post data*/ 
    } 
} 

は、今あなたが、URLを知っているポスト辞書を反復処理する必要があります。

for (key, _) in dictionary { 
    Database.database().child("posts/(key)").removeValue() 
} 

・ホープ、このヘルプあなた;)

+0

私はすべてのものではなく、ユーザー関連のものを削除したいだけです。したがって、価値が本当に存在するかどうかを知ることは重要です。 –

+0

申し訳ありませんが、私の答えを修正しました –

+0

ありがとう、でも、子供が特定の値を持っているかどうかを確認する方法はありますか? –

0

私の提案は、クラウドfunctiを使用することですすべてのデータを削除します。ここで

https://firebase.google.com/docs/functions/

、あなたはそれについての詳細を読むことができます。 クラウド機能がこのプロセスを管理している場合、削除が何らかの理由で失敗したり、ネットワーク接続が不正な場合など、気にすることはありません。

+0

子供に値が存在するかどうかを確認するにはどうすればいいですか? –

+0

どの点が不明ですか? – barotia

+0

私はコーディングの初心者であるため、これを本当に手に入れなければなりません。これは迅速に書かれていないので、時間がかかります。 –

0

これはわかりました。以下は、データベースを反復処理し、私の例でuserIdという値が子要素に含まれているかどうかを調べるコードです。

let userId = API.User.CURRENT_USER?.uid 

    API.Post.REF_POST.observeSingleEvent(of: .value) { (snapshot) in 

     let arraySnapshot = (snapshot.children.allObjects as! [DataSnapshot]) 
// This is in order to take every single child into Account. 
     arraySnapshot.forEach({ (child) in 
      if let dict = child.value as? [String: Any] { 
       let uid = dict["uid"] as? String 
       //now I check every single child whether it contains the userId or now 
           if uid == userId { 
            print("gefunden") 
            Database.database().reference().child("posts").child(child.key).removeValue() 
// I case the child contains the userId, I delete it. The child.key is the randomly created id of the child in which I am currently checking for the value. 
           } else { 
            print("nichts") 
           } 
      } 
     }) 
    } 

私の問題は、前に私は、データベース全体をプリントアウトし、それが自分のアカウントを削除しようとしている私のユーザーの値「UID」が含まれている場合、今、私は、私のデータベースにそれぞれの子のためにルックアップするということでした。

+0

プロセス中にアプリケーションがクラッシュするとどうなりますか? – barotia

関連する問題