繁体   English   中英

如何从 Firebase 实时数据库中获取不同节点的数据?

[英]How to fetch the data from different node from Firebase realtime database?

我是 Java 和 Firebase 实时数据库的新手。 目前,我正在做一个项目,当用户插入跟踪 ID 时,用户可以跟踪主机位置。 因此,当用户插入正确的 id 时,我需要获取主机位置的数据。 现在,当用户插入跟踪 ID 时,我面临程序搜索数据库的问题。

这是我的数据库结果。 这是我的数据库。

以下是我如何将数据获取到程序的方式。

 private void isTrackingID() { String userTrackingID = enterTracking.getText().toString().trim(); //Long userTrackingIDNumber = Long.parseLong(userTrackingID); Toast.makeText(this, "Tracking ID = " + userTrackingID, Toast.LENGTH_SHORT).show(); DatabaseReference reference = FirebaseDatabase.getInstance().getReference("HostID"); 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()) { latitudefromDatabase = String.valueOf(dataSnapshot1.child("HostLocation").child("latitude").getValue()); Log.i("testing for latitude", latitudefromDatabase); longitudefromDatabase = String.valueOf(dataSnapshot1.child("HostLocation").child("longitude").getValue()); Log.i("testing for longitude", longitudefromDatabase); Intent intent = new Intent(getApplicationContext(), MapsActivity.class); intent.putExtra("latitude", latitudefromDatabase); intent.putExtra("longitude", longitudefromDatabase); startActivity(intent); } }else { enterTracking.setError("Invalid Tracking ID from database"); enterTracking.requestFocus(); } } @Override public void onCancelled(@NonNull DatabaseError databaseError) { Log.d("error", databaseError.getMessage()); } }); }

当用户插入跟踪 ID 时,程序应该获取主机位置。 但是,我不断收到“来自数据库的无效跟踪 ID”。 插入正确的跟踪 ID 时。 那么伙计们,我应该在哪里以及如何进行更正? 非常感谢。

您的代码中的问题在于以下代码行:

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

Firebase 实时数据库查询只能返回树中更深一层的对象元素。 您无法使用简单的查询来查询这样的数据库模式。 除此之外,您的参考资料中还缺少一个级别(也许是 UID)。 因此,为了能够跟踪“id”属性包含“444xxx”值的所有用户,您可以考虑在数据库结构中添加一个新节点,如下所示:

Firebase-root
  |
  --- tracking
        |
        --- id: "444xx"
        |
        --- uid: "loiJ ... OD53"
        |
        --- latitude: 1.858625
        |
        --- longitude: 103.0855767

通过这种方式,您可以使用以下查询获取这些元素:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference trackingRef = rootRef.child("tracking");
Query query = trackingRef.orderByChild("id").equalTo(444xxx);

如您所见,如果您需要用户详细信息,则 UID 也存在。 上述做法称为反规范化,是 Firebase 的常见做法。 为了更好地理解,我推荐你看这个视频, Denormalization is normal with the Firebase Database

此外,当您复制数据时,需要记住一件事。 同样,您正在添加数据,您需要维护它。 换句话说,如果你想更新/删除一个项目,你需要在它存在的每个地方都这样做。

在您的数据库节点中,您有 Tracking 并且在查询中,您添加了 TrackingID 所以只需使用 Traking/id 而不是 TrakingID/id 检查下面的代码。

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



Query query = reference.orderByChild("Tracking/id").equalTo(userTrackingID);

你可以看看我的代码:

            DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
            reference.child("Users").orderByChild("phone").equalTo(number)
                    .addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot snapshot) {
                            if (snapshot.getChildrenCount() > 0) {
                                for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
                                    if (dataSnapshot.getChildrenCount() > 0) {
                                        UserData userData = dataSnapshot.getValue(UserData.class);
                                        Intent intent = new Intent(container.getContext(), UserDetailActivity.class);
                                        intent.putExtra("userData", userData);
                                        startActivity(intent);
                                    }
                                }
                            }else{
                                Toast.makeText(container.getContext(), "This mobile is not exist", Toast.LENGTH_SHORT).show();
                            }
                        }

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

                        }
                    });

这是我的数据库结构。我也在获取两个级别

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM