2016-11-12 1 views
0

まず最初に、私が何かをねじ込むとユーザーベース全体がなくなってしまうので、私は尋ねています。ユーザーがプロフィール画像を更新した場合、JSON内のキー値を更新する

投稿後にユーザーが画像を変更した場合に最新の画像を表示する方法がわからないため、現在のユーザーが自分のプロフィール画像を変更した場合、現在のユーザーに属しているときに投稿のキー値のペアを更新しようとしています。

私はこれを思いつきました。私はそれを行う正しい方法ですか?

FIRDatabase.database().reference().child("posts") 
      .queryOrdered(byChild: "username") 
      .queryEqual(toValue: self.currentUser.generalDetails.userName) 
      .observeSingleEvent(of: .value, with: { snapshot in 

    if let snapDict = snapshot.value as? [String:AnyObject] { 
      for each in snapDict { 
       FIRDatabase.database().reference().child("posts/\(each.key)") 
       .updateChildValues(["profileImageUrl" : downloadUrl!.absoluteString])      
      } 
     } 
}) 

構造体は次のようにある場合:OPによって行われたコメントに応えて

posts //All posts 
-KVfMmYqMny0n0_5gx9t //Post autogenerated key 
    comments 
    profileImageUrl: "http://..." 
    username: "John" 
+1

dbが実稼働環境にない場合は、dbの現在の状態をjsonとしてエクスポートして、何かを混乱させるだけで、変更前の状態をインポートすることができます。点線のボタンを押した後、右上のセクションデータベースを選択すると、firebaseコンソールでこれらのオプションを見つけることができます – ronatory

+0

私は上記のコメントに同意します。ライブノードからテストノードにデータをコピーして、そのテストデータに対するコードまた、常に表示するときにユーザーの画像が最新であることを確実にしたい場合は、それはかなり自動プロセスでなければなりません。投稿では、ユーザーのノード(プロフィール)への参照を保存し、投稿を読むとその参照を取得します。次に、現在のユーザーのプロファイル/イメージを読み込みます。それは常に画像が最新であることを保証します。あなたがそれをしない理由がありますか? – Jay

+0

@ジェイ私は実際にそれについて考えていましたが、それを行う方法を見つけることができませんでした。多分あなたは小さな例を与えることができますか?投稿のprofileImageUrl内にプロファイルノードprofileImageUrlを常に保持する必要がありますか?たとえば、https:/appName.firebaseio.com/users/uid/profileImageUrl –

答えて

1

質問は彼らが作るポストで更新ユーザーのプロフィール画像を維持する方法でありますたとえ彼らのイメージが変わっても。ここで

は、ユーザーのノード

users 
    -YMka9s0okspoaSf 
    name: "Kirk" 
    profileImageURL: "http://" 
    -YJos09m0ao098Ko 
    name: "Spock" 
    profileImageURL: "http://" 

、その後のポストが含まれており、ポストに

posts //All posts 
-KVfMmYqMny0n0_5gx9t //Post autogenerated key 
    comment: "Yes, I love Italian, and so do you" 
    posted_by: "YMka9s0okspoaSf" 
-KZKoa99jksoopd0a9Hq //Post autogenerated key 
    comment: "Yes" 
    posted_by: "YJos09m0ao098Ko" 

そして最終的にいくつか過度に冗長なコード作られた各ユーザーへの参照を保持ポストノードです投稿を読み込んで参照からの名前と画像をキャプチャします。

let postsRef = ref.child("posts") 
let usersRef = ref.child("users") 

postsRef.observeSingleEvent(of: .value, with: { snapshot in 
    for data in snapshot.children { 
      //convert the enumerator to a snapshot 
      let snap = data as! FIRDataSnapshot 

      //capture the value as a dictionary of String:String key:value pairs 
      let dict = snap.value! as! [String:String] 

      //grab the uid of the user that made the post 
      let uid = dict["posted_by"]! 
      let comment = dict["comment"]! 

      //craft a reference to the user that made the post 
      let thisUserRef = usersRef.child(uid) 

      //read in the users name once and print it 
      thisUserRef.observeSingleEvent(of: .value, with: { snapshot in 
       let dict = snapshot.value as! [String:String] 
       let name = dict["name"]! as String 
       let imageRef = dict["profileImageURL"]! as String 

       //on this line, load the image and display it 
       //then print the user and their comment 
       print("User \(name) said \(comment)) 

      }) 
    } 
}) 

このテクニックは、ユーザーの画像を常に最新の状態に保ち、投稿を変更した場合にその投稿に結び付けます。

単純化して、投稿画像ノードへの参照を直接投稿することもできますが、クエリ可能なので投稿ノードにuidを保存し、他のユーザデータにアクセスできるようにすることをおすすめします。

これは、たとえば、ユーザーが投稿を読んでユーザー名をクリックして、自分が好きな料理が何であるかを確認できるようにします。

関連する問題