2017-12-28 49 views
2

特定のユーザーから別のユーザーにメッセージを送信したいと考えています。私はこれを達成することができません。私は次のコードを使用すると、私は受信者からメッセージを取得します。私が必要とするのは、特にメッセージrecieveridsenderidにすることです。特定のユーザーのメッセージをFirebaseの別のユーザーに取得する方法

私のデータベース・スナップショット

enter image description here

ここに私のコードです:

Database.database().reference().child("chats") 
    .queryOrdered(byChild: "receiverid") 
     .queryEqual(toValue: "xEdACTcUWeOwrdIqjxeP5t5y4Kg2") 
      .observe(.childAdded, with: { snapshot in 
       let msgDict = snapshot.value as! [String: Any] 
       print(msgDict) 
      }) 
+1

Firebaseデータベースクエリは、1つのプロパティでのみ注文/フィルタリングできます。 2つのプロパティをフィルタリングしようとしていますが、これは不可能です。しかし、2つの値を1つのプロパティに結合し、それをフィルタリングすることができます。実際には、データ構造を変更してチャットルームをデータベースのレイヤーとしてモデル化し、連結されたユーザーIDをこのルームの名前として使用することをお勧めします。この例については、http://stackoverflow.com/questions/33540479/best-way-to-manage-chat-c​​hannels-in-firebase –

+0

を参照してください。特定の送信者から特定の受信機ですか?送信者の場合は送信したメッセージを照会することができ、受信者の場合は、自分宛のメッセージを照会することができます。これは、ある人から別の人に送信されたメッセージを照会する管理者の事ですか?ユースケースは何ですか? – Jay

答えて

1

Firebaseを使用して、あなたの意見の必要性に合わせてデータを構造化する必要がありますが。

2つのプロパティに基づいてクエリを実行しようとしているようですが、リアルタイムデータベースではこれを実行できません。私はあなたのデータの構造を変更することをお勧めします。各チャットのキーとしてsenderIdを使用します。 あなたはこのようなものがあるだろう。この方法:

"chats"{ 
    "-L1RW456789":{ 
     "messageKey":{ 
     "name":"ddddd", 
     "receiverid":"xEdACTcUWeOwrdIqjxeP5t5y4Kg2", 
     "sender_id":"-L1RW456789", 
     "text":"Hello World" 
     }, 
     "message2Key":{ 
     "name":"eeeee", 
     "receiverid":"xEdAdasd23123", 
     "sender_id":"-L1RW456789", 
     "text":"How are you?" 
     } 
    } 
} 

(それが今、メッセージの親ノードのキーを取得することによってアクセスされるあなたは、今、「sender_idの」属性を削除することができます) をそして、あなたはするだろう

Database.database().reference().child("chats").child("-L1RW456789") 
    .queryOrdered(byChild: "receiverid") 
     .queryEqual(toValue: "xEdACTcUWeOwrdIqjxeP5t5y4Kg2") 
      .observe(.childAdded, with: { snapshot in 
       let msgDict = snapshot.value as! [String: Any] 
       print(msgDict) 
      }) 
+0

良いですが、鍵が重複しないので動作しません。すなわち、送信者がメッセージを送信し、次に別のメッセージを送信する場合、第2のメッセージは、キーが同じであるため、第1のメッセージを上書きする。しかし、ユースケースが送信時にメッセージを上書きするのであれば、それは動作します。 – Jay

+0

Hmm。今、私はこれを読んでいます。*各メッセージの鍵としてあなたのsenderIdを使ってください。*あなたの構造はそうではありません。その構造は、送信側の鍵は親ノードであり、子は鍵を持っていますか?この場合、sender_id子ノードは親ノードであるため、すでに分かっているので必要ありません。おそらく明確化が役立つでしょうか? – Jay

+0

私の悪いです。私は "各チャットの鍵"を意味していません。編集した私の答え –

関連する問題