首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Firebase中的两个关键问题

Firebase中的两个关键问题
EN

Stack Overflow用户
提问于 2017-09-26 20:29:38
回答 2查看 146关注 0票数 0

我在使用Firebase。

1.问题:我创建了一个键:

代码语言:javascript
复制
final String CHATS_CHILD = "chats/" + mFirebaseDatabaseReference.push().getKey();
                mFirebaseDatabaseReference.child(CHATS_CHILD).push().setValue("and so on...");

你在图片中看到的结果。现在,我在Firebase中创建了一个带孩子的密钥,但是如何将密钥输入到我的android应用程序中呢?(我是说第一把钥匙,在聊天之后)

2.质量管理是类似的

你可以在我的照片上看到数据库。当我搜索文本时,如何在聊天之后获得第一个键?例如,我想要一个作为子键的键,其中包含文本"Test1“。

怎么做?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-26 21:05:01

我认为你应该平平你的数据,以获得消息键和聊天键,只使用消息文本。您可以将实际消息保存在单独的路径中(如" messages "),并且只在相关聊天的路径中保留消息键,如下所示:

创建Chat类:

代码语言:javascript
复制
public class Chat {

    private Map<String, Boolean> messageKeys;

    public Chat() {
        // Default constructor required for calls to DataSnapshot.getValue(Chat.class)
    }

    public Chat(Map<String, Boolean> messageKeys) {
        this.messageKeys = messageKeys;
    }

    public Map<String, Boolean> getMessageKeys() {
        return messageKeys;
    }

    public void setMessageKeys(Map<String, Boolean> messageKeys) {
        this.messageKeys = messageKeys;
    }
}

..and Message类:

代码语言:javascript
复制
public class Message {

    private String chatKey;
    private String text;
    private long time;

    public Message() {
        // Default constructor required for calls to DataSnapshot.getValue(Message.class)
    }

    public Message(String chatKey, String text, long time) {
        this.chatKey = chatKey;
        this.text = text;
        this.time = time;
    }

    public String getChatKey() {
        return chatKey;
    }

    public void setChatKey(String chatKey) {
        this.chatKey = chatKey;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public long getTime() {
        return time;
    }

    public void setTime(long time) {
        this.time = time;
    }
}

然后查询消息并查找其文本字段与所搜索的术语相等的消息,例如"Test1":

代码语言:javascript
复制
DatabaseReference chatsRef = FirebaseDatabase.getInstance().getReference("chats");
DatabaseReference messagesRef = FirebaseDatabase.getInstance().getReference("messages");

messagesRef.orderByChild("text").equalTo("Test1").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot child : dataSnapshot.getChildren()) {
            String messageKey = child.getKey();
            Message message = child.getValue(Message.class);
            String chatKey = message.getChatKey();
            // Now you have both the chatKey and the messageKey...
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException();
    }
});

在这种情况下,创建一个新的聊天和它的第一条消息如下(可以认为是对您第一个问题的回答):

代码语言:javascript
复制
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
String chatKey = rootRef.push().getKey();
String messageKey = rootRef.push().getKey();
Message newMessage = new Message(chatKey, "My message trial", Calendar.getInstance().getTimeInMillis());
Map<String, Boolean> messageKeys = new LinkedHashMap<>();
messageKeys.put(messageKey, true);
Chat newChat = new Chat(messageKeys);
rootRef.child("messages").child(messageKey).setValue(newMessage);
rootRef.child("chats").child(chatKey).setValue(newChat);

检索所有属于其密钥已知的聊天的消息:

代码语言:javascript
复制
String chatKey = "chatKey1";   // Get it somehow
DatabaseReference messagesRef = FirebaseDatabase.getInstance().getReference("messages");

messagesRef.orderByChild("chatKey").equalTo(chatKey).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<Message> messageList = new ArrayList<>();
        for (DataSnapshot child : dataSnapshot.getChildren()) {
            String messageKey = child.getKey();
            Message message = child.getValue(Message.class);
            messageList.add(message);
        }
        // Now you have all messages in messageList...
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException();
    }
});
票数 0
EN

Stack Overflow用户

发布于 2017-09-26 22:27:40

除了Mehmed的回答: Firebase不仅支持设置/检索单个字段,而且还支持整个类的对象。在下面的示例中,我定义了类MyChat,创建了很少的对象并将它们放入Firebase DB中。然后我检索所有它们(作为对象,而不仅仅是字符串),并将它们放入ArrayList中。

代码语言:javascript
复制
    FirebaseDatabase frDb = FirebaseDatabase.getInstance();
    DatabaseReference mFirebaseDatabaseReference = frDb.getReference();
    final String CHATS_CHILD = "chats/theChat" ; //+ mFirebaseDatabaseReference.push().getKey();

    // Create 3 objects of class MyChat
    MyChat chat1 = new MyChat("Test1", "21-Sep-2017");
    MyChat chat2 = new MyChat("Test21", "26-Sep-2017");
    MyChat chat3 = new MyChat("TestB", "28-Sep-2010");

    //Add all the chats to  Firebase DB
    mFirebaseDatabaseReference.child(CHATS_CHILD).push().setValue(chat1);
    mFirebaseDatabaseReference.child(CHATS_CHILD).push().setValue(chat2);
    mFirebaseDatabaseReference.child(CHATS_CHILD).push().setValue(chat3);


    // Here we will retrieve all the chats and put them to array
    // Declare array to keep results
    final ArrayList<MyChat> arr1 = new ArrayList<MyChat>();

    //Listener
    ChildEventListener chEvLst = mFirebaseDatabaseReference.child("chats").addChildEventListener(new ChildEventListener() {

        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                for (DataSnapshot ds1 : dataSnapshot.getChildren()) {
                    MyChat chatRes = ds1.getValue(MyChat.class);
                    Log.i("Next chat text:",chatRes.getmText());
                    Log.i("Next chat date:",chatRes.getmText());
                    arr1.add(chatRes); // retrieve and save chats to array
                }

        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

这是MyChat类

代码语言:javascript
复制
public class MyChat {


String mText = "Test1";       // default values...
String mDate =  "26-Sep-2017";

// *** MUST TO HAVE EMPTY CONSTUCTOR FOR FIREBASE !!! ***
public MyChat() {
}

// Second constructor
public MyChat(String mText, String mDate) {
    this.mText = mText;
    this.mDate = mDate;
}

// *** MUST TO HAVE ALL GETTERS/SETTERS FOR FIREBASE!!! ***
// Getters/setters
public String getmText() {
    return mText;
}

public void setmText(String mText) {
    this.mText = mText;
}

public String getmDate() {
    return mDate;
}

public void setmDate(String mDate) {
    this.mDate = mDate;
}

}

这就是由此产生的DB结构:

诚挚的问候!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46435272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档