【问题标题】:Reading the value of a child without knowing the value key在不知道值键的情况下读取孩子的值
【发布时间】:2021-11-09 18:25:21
【问题描述】:

我想获取之前推送的特定数据值(绿色圈出)。但是当我运行这段代码时,它也会显示密钥。

This is the Structure

我推送数据的类:

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
String uid = user.getEmail();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users");

reference.child(user.getUid()).child("Distance").push().setValue(LastValueRounded);
reference.child(user.getUid()).child("Speed").push().setValue(averagespeed);
reference.child(user.getUid()).child("Time").push().setValue(getTimerText());

我应该读取数据的类:

mAuth = FirebaseAuth.getInstance();
FirebaseUser user = mAuth.getCurrentUser();
String uid = user.getEmail();
DatabaseReference reference = 
    FirebaseDatabase.getInstance()
                    .getReference("Users");

reference.orderByChild("email")
         .equalTo(uid)
         .addValueEventListener(
    new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                if (snapshot.child("Distance").getValue() != null) {
                    String distance1 = snapshot.child("Distance").getValue().toString();
                    String speed1 = snapshot.child("Speed").getValue().toString();
                    String time1 = snapshot.child("Time").getValue().toString();
                 
                    distance.setText(distance1);
                    speed.setText(speed1);
                    time.setText(time1);
                }
            }
        }        

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.w("ERROR", "onCancelled", databaseError.toException());
        }
    });

The displayed data

【问题讨论】:

  • 请不要链接到图片。您链接的图片中的信息可以作为文本内嵌到您的问题中。

标签: java android firebase firebase-realtime-database google-cloud-platform


【解决方案1】:

我怀疑您的“getValue()”返回一个 Map 对象。你可以试试:

String distance1 = (String)(snapshot.child("Distance").getValue().get("MJw...9") );

【讨论】:

    【解决方案2】:

    当您使用以下参考时:

    DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users");
    reference.orderByChild("email")
         .equalTo(uid)
         .addValueEventListener(/* ... /*);
    

    这意味着您正在尝试获取“用户”节点下的所有子节点,其中“电子邮件”字段包含经过身份验证的用户的 UID 的值,但这不正确,因为在“用户”节点下有没有这样的孩子。为了能够仅获取与那些推送的元素对应的值,请使用以下代码行:

    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference uidRef = rootRef.child("Users").child(uid);
    uidRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DataSnapshot> task) {
            if (task.isSuccessful()) {
                DataSnapshot snapshot = task.getResult();
                for (DataSnapshot distanceSnapshot : snapshot.child("Distance").getChildren()) {
                    distance.setText(distanceSnapshot.getValue(String.class));
                }
                for (DataSnapshot speedSnapshot : snapshot.child("Speed").getChildren()) {
                    speed.setText(speedSnapshot.getValue(String.class));
                }
                for (DataSnapshot timeSnapshot : snapshot.child("Time").getChildren()) {
                    time.setText(timeSnapshot.getValue(String.class));
                }
            } else {
                Log.d("TAG", task.getException().getMessage()); //Don't ignore potential errors!
            }
        }
    });
    

    【讨论】:

    • 嗨,Ece Öğretmen!您是否尝试过我上面的解决方案,它有效吗?如果您认为我的回答对您有所帮助,请考虑通过单击左侧投票箭头下方的复选标记(✔️)来接受它。应将颜色更改为绿色。我真的很感激。谢谢!
    猜你喜欢
    • 2018-01-18
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多