在不知道值键的情况下读取孩子的值
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 - 如何在不更新地图的情况下使用默认值获取地图值