Timotej Arnuš
Timotej Arnuš

Reputation: 145

Reading data from Firebase Realtime Database for a specific user

What is the proper way to read data from Firebase Realtime Database? I have created a database "Mybill"s with child bills. In child Bills, I am saving UserId from FirebaseAuth so it should be easy to find bills for a specific user and in userID child, I have a child that I have created using the .push() method and in that, I have data about the bill.

It looks like this:

enter image description here

How should I change my Java code so I can get all the bills saved for a specific user (the user that is currently logged in) this is my code for now :

final FirebaseDatabase database = FirebaseDatabase.getInstance();
       DatabaseReference ref = database.getReference("bills");
       Query checkUser = ref.orderByChild("UserId").equalTo(Autentication.GetUser());

       // Attach a listener to read the data at our posts reference
       checkUser.addListenerForSingleValueEvent(new ValueEventListener() {
           @Override
           public void onDataChange(DataSnapshot dataSnapshot) {

               String email = dataSnapshot.child("email").getValue(String.class);
               String market = dataSnapshot.child("market").getValue(String.class);
               String price = dataSnapshot.child("price").getValue(String.class);
               String date = dataSnapshot.child("date").getValue(String.class);

           }

           @Override
           public void onCancelled(DatabaseError databaseError) {
               System.out.println("The read failed: " + databaseError.getCode());
           }
       });

Upvotes: 0

Views: 82

Answers (1)

Alex Mamo
Alex Mamo

Reputation: 138824

  • How should I change my Java code so I can get all the bills saved for a specific user (the user that is currently logged in)

To do that, please use the following lines of code:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("bills").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String email = ds .child("email").getValue(String.class);
            String market = ds .child("market").getValue(String.class);
            String price = ds .child("price").getValue(String.class);
            Log.d("TAG", email + "/" + market + "/" + price);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d("TAG", databaseError.getMessage()); //Don't ignore potential errors!
    }
};
uidRef.addListenerForSingleValueEvent(valueEventListener);

The "date" cannot be read as a String, as it's an object. So the most appropriate way would be to read it as a Map<String, Object>. In this way, you are getting only the bills that correspond to a specific user (logged-in user).

Upvotes: 2

Related Questions