【问题标题】:How do i put dataSnapshot into a HashMap and Iterate Firebase Android如何将 dataSnapshot 放入 HashMap 并迭代 Firebase Android
【发布时间】:2018-07-24 23:14:34
【问题描述】:

我正在尝试将 DataSnapshot 对象转换为 HashMap,然后对其进行迭代以访问每个玩家的纬度经度和头像值。因为在此之后我将使用这些值在地图上渲染标记。

db

另一个问题是可以从查询中排除用户本身吗? 我的意思是可以写 mydb.child("map").child("players").notequalto(username).addValueEventList... 还是拉取数据后必须用代码排除?

    mydb.child("map").child("players").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                HashMap<String,Object> players= new HashMap();
for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
                players.put(childSnapshot.getKey(), childSnapshot.getValue());
            }
                    Log.d("players",dataSnapshot.getValue().toString());





            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

输出:

 D/players: {lifesuxtr={lat=40.8901741, long=29.3772963, avatar =petyr}, lastpeony={lat=40.89, long=29.37, avatar=dino}}

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    假设 map 节点是您的 Firebase 数据库根的直接子节点,要获取这些值,请使用以下代码:

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference playersRef = rootRef.child("map").child("players");
    ValueEventListener eventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Map<Double, Double> players = new HashMap<>();
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                double lat = ds.child("lat").getValue(Double.class);
                double long = ds.child("long").getValue(Double.class);
                Log.d("TAG", lat + " / " + long);
                players.put(lat, long);
            }
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.d("TAG", databaseError.getMessage()); //Don't ignore potential errors!
        }
    };
    playersRef.addListenerForSingleValueEvent(eventListener);
    

    输出将是:

    40.89 / 29.37
    40.89 / 29.37
    

    有了这些值,您现在可以添加标记。回答你的问题,不,你不能在查询中使用否定。 Firebase 中没有 notEqualTo() 方法。

    【讨论】:

    • @olajide 谢谢olajide!
    • OP 要求的内容非常简单,您已经完成了大部分工作。我们只需要将数据放入HashMap。我在答案中添加了几行
    • @olajide 编辑已获批准,但再次编辑以在 for 循环之外获取 `players` 地图的声明。
    • long 是 java 中的一个关键字,用于存储 64 位整数(Java 原始类型)值。这就是为什么我将变量重命名为longi
    • @DragonFire 哦,是的,刚刚删除了我答案的第一部分。谢谢
    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多