The code shown below is the code used to retrieve the multiple users location from Realtime Firebase and assign to the markers on map:
public void onMapReady(GoogleMap googleMap) { mMap = googleMap; mMap.getUiSettings().setZoomControlsEnabled(true); DatabaseReference db = FirebaseDatabase.getInstance().getReference(); DatabaseReference userLocationRef = db.child("User_Location"); db.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { userLocationRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() { @Override public void onComplete(@NonNull Task<DataSnapshot> task) { if (task.isSuccessful()) { try { for (DataSnapshot ds : task.getResult().getChildren()) { String userID = String.valueOf(ds.child("userID").getValue()); String encryptedLatitude = ds.child("You").child("l").child("0").getValue(String.class); String encryptedLongitude = ds.child("You").child("l").child("1").getValue(String.class); Log.d("encryptedLocation", encryptedLatitude + ", " + encryptedLongitude); //Check the values Log.d("userid", userID); //Check the values //decrypt LocationEncryption locationEncryption = new LocationEncryption(); String decryptedLatitude = null; String decryptedLongitude = null; decryptedLatitude = locationEncryption.decrypt(encryptedLatitude); decryptedLongitude = locationEncryption.decrypt(encryptedLongitude); Log.d("Decrypted", decryptedLatitude + ", " + decryptedLongitude); //Check the values double lat = Double.valueOf(decryptedLatitude); double lng = Double.valueOf(decryptedLongitude); //Add location on Google Map LatLng location = new LatLng(lat, lng); if (hm.containsKey(userID)) { hm.get(userID).remove(); } currentLocationMarker = mMap.addMarker(new MarkerOptions().position(location).title(userID)); currentLocationMarker.showInfoWindow(); hm.put(userID, currentLocationMarker); } } catch (Exception e){ e.printStackTrace(); } } else { Log.d("TAG", task.getException().getMessage()); //Don't ignore potential errors! } } }); } @Override public void onCancelled(@NonNull DatabaseError error) { } });
The structure of the real-time firebase is as follow:
The result of the code is as follow:
When I click on the marker, it only shows the userID of the user. I want the marker to show the name of the user together with the userID. But the problem is that the multiple users’ names are stored in Firestore.
The structure of the Firestore is as follow: The admin details and the user details are stored in the same collection “Users”. The fields “isAdmin” and “isUser” are the method to differentiate them. I only need the username and the admin name is not required.
So, how to retrieve multiple users’ names from Firestore and assign the names to the correct markers on the map.
Advertisement
Answer
When I click on the marker, it only shows the userID of the user. I want the marker to show the name of the user together with the userID.
The best option that you have is to store the name of the user right near the userID. There is no need to create another database call to only get the name of the user. So your new database schema should look like this:
Firebase-root | --- User_Location | --- $uid | --- userID: "Jk8i...1jy2" | --- userName: "Zi Zian Yeo" 👈
And in code should look like this:
String userID = ds.child("userID").getValue(String.class); String userName = ds.child("userName").getValue(String.class);
And to add these values as a title of the marker please use the following lines of code:
String title = userID + "/" + userName; currentLocationMarker = mMap.addMarker(new MarkerOptions().position(location).title(title));