在用户之间检索Firebase数据

时间:2016-02-13 12:32:10

标签: android firebase firebase-realtime-database nosql

我希望能够始终在用户之间检索消息,但是当我专门引用我在向后端添加新消息时创建的子节点时,我似乎只能这样做(子节点是“ + USER1PHONENUMBER:+ USER2PHONENUMBER“并且两个用户都将数据写入同一子节点。这适用于当用户进入联系人列表并选择联系人时,因为我可以获得两个用户电话号码并知道要使用哪个子节点。我这样做了:

mkdir /mnt/server
sshfs user@server:dir /mnt/server
cd /mnt/server

事情是,我希望以某种方式接收消息,我的用户在子节点上收到新消息,这会留下他们的电话号码,然后我可以存储它并在列表视图中显示联系人详细信息,所以我可以在用户手机上随时收到新消息时创建通知。任何想法如何实现这一点?我现在真的没有任何想法。

我有以下Messages类结构:

if (senderNumber > receiverNumber) {
            Firebase ref = new Firebase(Passwords.FB_LINK).child("Message").child(username + ":" + binderContact.getNumber());

            ref.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot msg : dataSnapshot.getChildren()) {
                        Message message = msg.getValue(Message.class);
                        Log.d("TAG", "Message Received: " + message.getText());
                    }
                }

                @Override
                public void onCancelled(FirebaseError firebaseError) {

                }
            });
        }
        else {
            Firebase ref = new Firebase(Passwords.FB_LINK).child("Message").child(binderContact.getNumber() + ":" + username);

            ref.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot msg : dataSnapshot.getChildren()) {
                        Message message = msg.getValue(Message.class);
                        Log.d("TAG", "Message Received: " + message.getText());
                    }
                }

                @Override
                public void onCancelled(FirebaseError firebaseError) {

                }
            });
        }

这是我将数据保存到firebase的方式以及它在firebase end上的样子(用户名=用户的phonenumber):

public class Message {
    private String from;
    private String to;
    private String text;
    private String time;
    private String timeCreated;
    private Boolean repeat;
    private String weekdays;
    public Message() {}

    public Message(String from, String to, String text, String time, String timeCreated, Boolean repeat, String weekdays) {
        this.from = from;
        this.to = to;
        this.text = text;
        this.time = time;
        this.timeCreated = timeCreated;
        this.repeat = repeat;
        this.weekdays = weekdays;
    }
    public String getFrom() {
        return from;
    }
    public String getTo() {
        return to;
    }
    public String getText() {
        return text;
    }
    public String getTime() {
        return time;
    }
    public String getTimeCreated() {
        return timeCreated;
    }
    public Boolean getRepeat() {
        return repeat;
    }
    public String getWeekdays() {
        return weekdays;
    }


}

enter image description here

1 个答案:

答案 0 :(得分:2)

这可能是答案的极简化;

messages
   message_id_0
     from: from_user_phone
     to: to_user_phone
     message: "Rock on, Garth"
   message_id_1
     from: from_user_phone
     to: to_user_phone
     message: "Rock on, Wayne"

所有用户都会观察有关childAdded事件的消息节点。

添加新邮件时,会将其发送给所有客户。

客户端应用检查邮件以确定是否“to_user_phone”#39;是该客户端,如果是,请在列表中显示它。

以上是概念性的,因为它不是最好的结构;你可以做这样的事情

users:
  user_info
    name
    phone
    shoe_size
  messages
    message_0
      from: from_user_phone
      message: "Planet 9 is called.. Planet 9"

然后每个用户都可以观察他们自己的消息节点以获取传入消息。

工作结构有许多不同的方法,因此您需要探索适合您情况的方法。