在不知道值键的情况下读取孩子的值

Posted

技术标签:

【中文标题】在不知道值键的情况下读取孩子的值【英文标题】: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

【问题讨论】:

请不要链接到图片。您链接的图片中的信息可以作为文本内嵌到您的问题中。 【参考方案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!您是否尝试过我上面的解决方案,它有效吗?如果您认为我的回答对您有所帮助,请考虑通过单击左侧投票箭头下方的复选标记(✔️)来接受它。应将颜色更改为绿色。我真的很感激。谢谢!

以上是关于在不知道值键的情况下读取孩子的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在不知道 json 键的情况下使用 JsonReader 从 json 读取值

在不知道对象键的情况下访问对象值

Groovy - 如何在不更新地图的情况下使用默认值获取地图值

在不知道其中一个外键的情况下删除数据透视表行

在不知道确切行键的情况下在 Bigtable 中查找最新时间戳

c#Dictionary<string,string>如何在不知道键的情况下遍历项目[重复]