【问题标题】:Firebase nested valueFirebase 嵌套值
【发布时间】:2016-12-02 18:54:41
【问题描述】:

我正在尝试根据属性值查询我的 firebase 数据库中的项目。

这是我的结构:

这是我的 POJO 对象:

public class LapTime {

    private int vehicleType;
    private String track;
    private String user;
    private int time;
}

这是我的查询代码:

mDatabase.child("lap-time").orderByChild("track").equalTo(mTrackUuid).addValueEventListener(new ValueEventListener() {
    @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            time = dataSnapshot.getValue(LapTime.class).getTime() + "ms");
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

我的问题是我返回的数据快照针对的是 root lap-time 而不是 UUID,因此 getValue(LapTime.class) 给了我一个空对象...

这是我得到的数据快照:

DataSnapshot { key = lap-time, value = {-KXwSxD0GYVC6awV8abw={track=-KXwSxCeV2Ib4Gt4pvjy, time=105000, vehicle-type=0, user=ZQKwPfRF0mVL5jAO7FaSPcsF7t42}} }

这就是我想要得到的:

DataSnapshot { key = -KXwSxD0GYVC6awV8abw, value ={track=-KXwSxCeV2Ib4Gt4pvjy, time=105000, vehicle-type=0, user=ZQKwPfRF0mVL5jAO7FaSPcsF7t42}} }

我该怎么做?

【问题讨论】:

  • 您想解析所有单圈时间的孩子还是特定的孩子?您可以使用dataSnapshot.getChildren() 遍历孩子。否则,需要在带有UID的节点上设置ValueEventListener

标签: android firebase-realtime-database


【解决方案1】:

由于您的查询代码实际上可以有多个结果,您应该调用dataSnapshot.getChildren() 并遍历子项以获得您正在寻找的结果。特别是,mDatabase.child("lap-time").orderByChild("track").equalTo(mTrackUuid) 是一个可能有多个结果的查询,因为可能存在多个LapTime 对象可能具有指向相同mTrackUuid 的轨迹的情况。现在,要获得您发布的日志的结果,您需要像这样构造一个查询:mDatabase.child("lap-time").child("-KXwSxD0GYVC6awV8abw")。请注意 orderByChild/equalTo 查询是如何消失的,因为这些查询会导致可能返回数据列表而不是奇异值的条件查询。

【讨论】:

  • 如果我不知道 UID -KXwSxD0GYVC6awV8abw 怎么办?这些是自动生成的,我不跟踪它们。
  • 好的,通过遍历孩子来让它工作!
猜你喜欢
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 2020-11-18
相关资源
最近更新 更多