0

I have a structure of Firebase database:

DB

-User

--UID

----UsersMessages

-------uniqueID

-------textMessage

-------typeOfMessage

DB Structure Code

private void takeDataFromFirebase(){
        Query my_message= mRef.child(USERS_CHILD)
                .orderByChild(USER_MESSAGES);
        my_message.addChildEventListener(new ChildEventListener() {


     @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String 
{
}
            @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) {

            }
        });
    }

But I need to get all Messages from my users. How can I get those? How I can search only childs "Messages" without "Users" and take "Message text value". Can I? How I can add this information to ListView?

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
Kralon
  • 9
  • 6

2 Answers2

0

To get all messages across all users, please use the following code:

FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
String uid = firebaseUser.getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference messagesRef = rootRef.child(USERS_CHILD).child(uid).child("Messages");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String messageText = ds.child("MessageText").getValue(String.class);
            Log.d("TAG", messageText);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
messagesRef.addListenerForSingleValueEvent(eventListener);

Your output will be:

asasddd
asasddd
asasddd

To get the messages from the users, please use the following code:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("Users");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String userKey = ds.getKey();

            DatabaseReference messagesRef = usersRef.child(userKey).child("Messages");
            ValueEventListener eventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for(DataSnapshot dSnapshot : dataSnapshot.getChildren()) {
                            String messageText = dSnapshot.child("MessageText").getValue(String.class);
                            Log.d("TAG", messageText);
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {}
            };
            messagesRef.addListenerForSingleValueEvent(eventListener);  
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
usersRef.addListenerForSingleValueEvent(valueEventListener);
Alex Mamo
  • 130,605
  • 17
  • 163
  • 193
  • I try to use your code, but it does not work correctly, i really don't know why. I use right path to note "Messages", next i try to make UsersMessage object and then try to get value from database to object and write to concole "MessageText". I use this construction, where i wrong? – Kralon Sep 28 '17 at 11:48
  • 'UsersMessage message = ds.child(USER_MESSAGE_TEXT).getValue(UsersMessage.class); Log.d(TAG, message.text);' – Kralon Sep 28 '17 at 11:51
  • Sry, was my mistake, i forget to use a `.child("Users")`. Please see my updated code and try again. Does it work this time? – Alex Mamo Sep 28 '17 at 11:51
  • My constant field 'USERS_CHILD' consist "Users", and, i think we need not use it again, i dont think, that problem in it – Kralon Sep 28 '17 at 11:56
  • i need to get around the node with user unique ID and get around node "message random unique id" – Kralon Sep 28 '17 at 12:01
  • Oh. i understand. I found the problem. You need to `uid` child as i added in my answer. `String uid = firebaseUser.getUid();` Should work now. – Alex Mamo Sep 28 '17 at 12:02
  • Yes, i see, but again - this UID is random unique, i dont understand, how i can get around this node, i need get around and take just .child ("MessageText"). I want to get all Messages from all users, but i canlt get their uid. Whats to do? – Kralon Sep 28 '17 at 12:08
  • Yes, UID is random unique but is generated by Firebase. In order to use it, first you need to get it. You cannot omit a child. YOU CONNOT use `rootRef.child(USERS_CHILD).child("Messages")` YOU NEED to use: `rootRef.child(USERS_CHILD).child(uid).child("Messages")` in which uid is what i have added in my updated answer. I have already test it. Works 100% – Alex Mamo Sep 28 '17 at 12:13
  • your code is good, and it work 100%, but how i can get another UID? I heard about `Querry` and `orderAtChild`, but my code doen't work =) – Kralon Sep 28 '17 at 12:20
  • With this code you can get only the messages that belong to a single user (the user that has logged in). Isn't that what you were asking for? Or is anything else? – Alex Mamo Sep 28 '17 at 12:22
  • Maybe I did not exactly put it. I need to receive messages from all users. To do this, I must only access the lowest nodes, such as "MessageText" – Kralon Sep 28 '17 at 12:25
  • In this case, you need to query your database twice. See again my updaed answer. – Alex Mamo Sep 28 '17 at 12:38
  • Heh, unfotunatly, it doesn't work. I try everithing... Do you sure, that firebase doesnot include functions, let omit children? Or serch children from another nodes? – Kralon Sep 28 '17 at 12:55
  • 100% sure that Firebase does not have functions that allow you to omit childrens. What is the error now? Can show me a scren-shot of your code? – Alex Mamo Sep 28 '17 at 12:56
  • But thx for help, l'll go to read documentation( may be i could find any info about my problem – Kralon Sep 28 '17 at 12:56
  • Made a few more changes. Plese try again. Works? – Alex Mamo Sep 28 '17 at 13:00
  • No, but i think because i dont know unique name of messages. They generates by `String uniqeID = mRef.child(USERS_CHILD).child(USER_MESSAGES).push().getKey();` – Kralon Sep 28 '17 at 13:06
  • You dont need to know them. getChildren does this for you. Forget about the first piece of code. Use just the second. Should work if your database is the same as in the picture. Did you tried? – Alex Mamo Sep 28 '17 at 13:08
0

First, you need to get DatabaseRefence with something like:

DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("User/...pathToMessage/Messages");

Then you can load all your messages with a callback:

databaseReference.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            // callback to get all your messages from user.
            if (dataSnapshot == null) return;
            MessageModel mess = dataSnapshot.getValue(MessageModel.class);
            // display message here
        }

        @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) {

        }
    });
Kingfisher Phuoc
  • 8,052
  • 9
  • 46
  • 86