【问题标题】:How to retrieve multiple username from Firestore and assign the username to the correct markers on map如何从 Firestore 检索多个用户名并将用户名分配给地图上的正确标记
【发布时间】:2022-01-21 08:45:30
【问题描述】:

下面显示的代码是用于从 Realtime Firebase 检索多个用户位置并分配给地图上的标记的代码:

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

        }
    });

实时firebase的结构如下:

代码结果如下:

当我点击标记时,它只显示用户的用户 ID。我希望标记显示用户名和用户 ID。但问题是多个用户的名称都存储在 Firestore 中。

Firestore 的结构如下: 管理员详细信息和用户详细信息存储在同一集合“用户”中。 “isAdmin”和“isUser”字段是区分它们的方法。我只需要用户名,不需要管理员名称。

那么,如何从 Firestore 中检索多个用户的名称并将名称分配给地图上的正确标记。

【问题讨论】:

  • 我不确定我是否理解。您正在使用代码从实时数据库中读取数据,而屏幕截图显示的是 Firestore 数据库。那么您使用的是哪个确切的数据库?
  • 用户名和用户电子邮件存储在 Firestore 中,同时存储用户的位置。我用来从firebase检索数据的代码只是为了展示应用程序的概念,没有太大问题。
  • 问题是如何从firestore中检索用户名并将它们分配给地图上的正确标记。现在,我只需在单击标记时显示用户 ID。希望你能明白我想说什么。谢谢
  • 您正在从实时数据库获取userID。请编辑您的问题并将您的数据库结构添加为 JSON 文件。您可以通过单击 Firebase Console 的溢出菜单 (⠇) 中的导出 JSON 来简单地获取它。
  • 我已通过上传实时 Firebase 结构的图像来更新问题。我不确定如何将实时 firebase 结构的 JSON 文件上传到问题中。谢谢。

标签: java android firebase google-cloud-platform google-cloud-firestore


【解决方案1】:

当我点击标记时,它只显示用户的用户 ID。我希望标记显示用户名和用户 ID。

您拥有的最佳选择是将用户名存储在用户 ID 附近。无需创建另一个数据库调用来仅获取用户名。因此,您的新数据库架构应如下所示:

Firebase-root
  |
  --- User_Location
       |
       --- $uid
            |
            --- userID: "Jk8i...1jy2"
            |
            --- userName: "Zi Zian Yeo" ?

在代码中应该是这样的:

String userID = ds.child("userID").getValue(String.class);
String userName = ds.child("userName").getValue(String.class);

要将这些值添加为标记的标题,请使用以下代码行:

String title = userID + "/" + userName;
currentLocationMarker = mMap.addMarker(new MarkerOptions().position(location).title(title));

【讨论】:

  • 谢谢,我稍后试试。我在这里有个问题。是否可以从 Firebase 存储中获取图像并在我单击后将图像添加到标记上?
  • 试一试,告诉我它是否有效。
  • 是的,您可以使用自己的一个更改标记图标。
  • 非常感谢,先生。如果我遇到任何问题,我会在这里发表评论。
  • 谢谢,先生,它有效。我将尝试从 firebase 存储中检索图像并将其分配给地图上的标记。如果我遇到任何问题,我会在这里发布一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 2012-01-06
  • 2013-12-11
  • 1970-01-01
  • 2018-03-16
  • 2018-12-05
  • 1970-01-01
相关资源
最近更新 更多