【问题标题】:How to retrieve specific data of a specific user with UID from a Firebase realtime database如何从 Firebase 实时数据库中检索具有 UID 的特定用户的特定数据
【发布时间】:2021-05-15 16:37:57
【问题描述】:

我是 Java 编码的新手。目前,我正在尝试从我的 firebase 实时数据库中获取“特定”数据。就我而言,我想使用 UserID 来获取 HostID 中的纬度和经度。但是,我无法获取来自不同帐户的数据。我对我的问题做了一些研究。还是不知道在使用UserID时如何获取HostID中的经纬度。

以下是我如何将数据存储到数据库中。

    private void saveDatatoDatabase(Location location) {
        String latitude = String.valueOf(location.getLatitude());
        String longitude = String.valueOf(location.getLongitude());

        //Access to database
        rootNode = FirebaseDatabase.getInstance();
        reference = rootNode.getReference("HostID");

        //Get the lat and log to the database
        TrackingIDClass IDclass = new TrackingIDClass(latitude, longitude);

        reference.child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("TrackingID").child("ID").setValue(IDclass);
    }

这是我的数据库数据。

data from realtime database

这是我使用同一个主机帐户检索数据的方法。

@Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;

        //LatLng sydney = new LatLng(-34,151);
       // LatLng lastLocationPlaced = sydney;

        DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("HostID")
                .child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("TrackingID").child("ID");

        ValueEventListener listener = databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                String latitude = dataSnapshot.child("latitude").getValue(String.class);
                String longitude = dataSnapshot.child("longitude").getValue(String.class);

                Double Latitude = Double.parseDouble(latitude);
                Double Longitude = Double.parseDouble(longitude);

                LatLng latLng = new LatLng (Latitude,Longitude);
                MarkerOptions markerOptions = new MarkerOptions();
                markerOptions.position(latLng);
                markerOptions.title("Lat:" + Latitude+" Lon:" + Longitude);
                mMap.addMarker(markerOptions);
                //lastLocationPlaced = latLng;

                mMap.animateCamera((CameraUpdateFactory.newLatLngZoom(latLng,12.0f)));
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });

    }

现在,当我使用 UserID 帐户时,我在获取纬度的过程中遇到了问题。我真的不确定如何从这里开始,我看不到任何前进的方法。请指教。非常感谢。

更新!!!

现在我对 TrackingID 的搜索方式做了一些更改。

 private void isTrackingID() {
        String userTrackingID = enterTracking.getText().toString().trim();
        //Long userTrackingIDNumber = Long.parseLong(userTrackingID);

        Toast.makeText(this, "testing = " + userTrackingID, Toast.LENGTH_SHORT).show();

        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("HostID").child(firebaseAuth.getUid());

        Query query = reference.orderByChild("TrackingID/ID").equalTo(userTrackingID);

        query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
              if (dataSnapshot.exists()) {

                  Log.i("checking", "this is value message");

                   enterTracking.setError(null);

                   String IDfromDatabase = dataSnapshot.child(userTrackingID).getValue(String.class);

                   for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
                       String Latitudevalue = String.valueOf(dataSnapshot1.child("latitude").getValue());
                       Log.i("testing for lol", Latitudevalue);
                       String Longitudevalue = String.valueOf(dataSnapshot1.child("longitude").getValue());
                       Log.i("testing for latitude", Longitudevalue);

                      String latitudefromDatabase = dataSnapshot1.child("latitude").getValue(String.class);
                      String longitudefromDatabase = dataSnapshot1.child("longitude").getValue(String.class);

                       Double Latitude = Double.parseDouble(latitudefromDatabase);
                       Double Longitude = Double.parseDouble(longitudefromDatabase);

                      Intent intent = new Intent(Latitude_Longitude.this, MapsActivity.class);

                      intent.putExtra("latitude", Latitude);
                      intent.putExtra("longitude", Longitude);

                       startActivity(intent);

                   }
               }else {
                    enterTracking.setError("Invalid Tracking ID from database");
                    enterTracking.requestFocus();
                   }
                }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.d("error", databaseError.getMessage());

            }
        });
    }

添加这些代码后,logcat 一直显示“W/PersistentConnection: pc_0 - 使用未指定的索引。您的数据将在客户端下载和过滤。考虑添加 '".indexOn": "TrackingID/ID"' HostID/q6jJMcxtTxMkxiktl6K4eDBSrRP2 到您的安全和 Firebase 数据库规则以获得更好的性能”和 Edittext 的输出一直说“来自数据库的无效跟踪 ID。”不知道哪里错了……

【问题讨论】:

  • 您需要在 Firebase 控制台中调整您的数据库规则以允许访问其他用户的数据。
  • @Cole Tustin 我应该如何调整数据库规则以及在不知道 HostID 的 UID 的情况下如何获取位置?
  • 首先,停止忽略错误。使用Log.d(TAG, databaseError.getMessage());。您是否在 logcat 中打印了一些内容?除此之外,这段代码中究竟有什么不能按您期望的方式工作?告诉我们共享代码有什么问题。你有什么错误吗?请回复@AlexMamo
  • 我已经使用了 Log.d(TAG , databaseError.getMessage());已经,但是android studio说TAG字有错误,需要采取措施....

标签: java android firebase firebase-realtime-database


【解决方案1】:

您将需要通过某种逻辑查找用户的 UID,可能使用基于位置 Order by Child 的查询。

如果您已经知道用户的 UID,则可以在典型的 read method 中使用它,但需要 Security Rules 允许任何用户读取任何其他用户的信息

【讨论】:

  • 究竟是如何通过child查询和订购的呢?因为我的项目需要从使用Tracking ID的主机获取位置。因此,程序应该搜索 Tracking ID 而不是 hostID....
  • OrderByChild() 使用从基本参考中指定的路径,例如,如果您有一个用户列表,并且您想要查找处于特定经度的所有用户 - 您将使用 @987654325 @ - 这会根据 position/longitude 中的值对“用户”列表进行排序,这样您就可以找到范围内或相等的值 X
  • 我已根据您的建议进行了更改,并更新了帖子。但是,该程序仍然显示“W/PersistentConnection: pc_0 - 使用未指定的索引。您的数据将在客户端下载和过滤。考虑在 HostID/q6jJMcxtTxMkxiktl6K4eDBSrRP2 中添加 '".indexOn": "TrackingID/ID"'安全和 Firebase 数据库规则以获得更好的性能”和“检查,这是价值消息”的日志仍然没有显示......
  • 此警告让您知道您的规则当前不支持索引,需要一组规则才能触发“索引开启”事件。您需要指定其中的路径。索引的生成通常是该字段变量的一次性过程 - 您可以在此处阅读:firebase.google.com/docs/database/security/indexing-data
  • 这意味着我的编码(带有最新更新)是正确的,现在问题只出在实时数据库规则上吗?
猜你喜欢
  • 2021-08-22
  • 2019-02-04
  • 2020-07-15
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
相关资源
最近更新 更多