【问题标题】:How to retrieve 'double' values saved under one key in Firebase?如何检索保存在 Firebase 中的一个键下的“双”值?
【发布时间】:2017-06-01 04:21:09
【问题描述】:

我已将Geofire 坐标存储在数据库中,现在我正尝试使用childEventListener() 检索它们,如下所示:

    mDatabase.child("geofire").child(key).child("l").addChildEventListener(new ChildEventListener() {
                                                @Override
                                                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                                                    if (dataSnapshot.getValue() != null) {
                                                        //error on line below
                                                        Map<Double, Double> newRequest = (Map<Double, Double>) dataSnapshot.getValue();
                                                        venueLatString = newRequest.get(0).toString();
                                                        venueLngString = newRequest.get(1).toString();
                                                        Toast.makeText(getBaseContext(), dataSnapshot.getValue().toString(), Toast.LENGTH_SHORT).show();
                                                    } else {
                                                        Toast.makeText(getBaseContext(), "NULLL", Toast.LENGTH_SHORT).show();
                                                    }
                                                }
                                                ...
                                                ...
                                            });

Geofire 坐标存储在数据库中,如下所示:

我收到此错误:java.lang.ClassCastException: java.lang.Double cannot be cast to java.util.Map 在上面指定的行。

这里出了什么问题,为什么会出现这个错误?

请告诉我。

【问题讨论】:

  • 您是要获取整个地理位置还是仅获取特定的双精度值?
  • 特定的双精度值...如问题中所示。

标签: android firebase firebase-realtime-database classcastexception geofire


【解决方案1】:

如果使用addChildEventListener,则生成的DataSnapshot 来自被引用节点的子节点。因此,在您的情况下,您的 ref 节点是 l,然后在 onChildAdded 内部,dataSnapshot 是:

  • 0,值为28.8...

  • 1,值为78.7...

所以onChidAdded() 将被调用两次。

您可以根据该逻辑修改代码或改用addValueEventListener。如果你使用addValueEventListener,你的代码会是这样的:

mDatabase.child("geofire").child(key).child("l").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.getValue() != null) {
            Double d1 = (Double) dataSnapshot.child("0").getValue();
            Double d2 = (Double) dataSnapshot.child("1").getValue();

            venueLatString = String.valueOf(d1);
            venueLngString = String.valueOf(d2);
        } else {
            Toast.makeText(getBaseContext(), "NULLL", Toast.LENGTH_SHORT).show();
        }
    }

    ...
});

希望对你有帮助

【讨论】:

  • 得到这个错误:java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map after using addValueEventListener.
  • 你真的需要它是Map 对象还是List 可以吗?我会根据您的需要编辑我的答案
  • 我只需要将各自的值分配给各自的字符串venueLatStringvenueLngString
  • 试试这个venueLatString = dataSnapshot.child("0").getValue() 并将其更改为1 for venueLngString
  • 用您上面评论中的代码编辑答案,我会接受。
【解决方案2】:

请尝试关注。

final HashMap<String, Object> taskMap = (HashMap<String, Object>) objectMap.getValue();
                        double lat = Double.parseDouble(taskMap.get("0"));
                        double lng = Double.parseDouble(taskMap.get("1"));

【讨论】:

  • 这个错误现在:java.lang.ClassCastException: java.lang.Double cannot be cast to java.util.HashMap.
  • 有什么改进吗?
【解决方案3】:
mDatabase.child("geofire").child(key).child("l").addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                double latati = 0, longit = 0;
                for (DataSnapshot child : dataSnapshot.getChildren()) {
//                    Log.e("!! All Data ::> ", child.getKey()+" "+child.getValue());
                    if (child.getKey().equalsIgnoreCase("0")) {
                        latati = Double.parseDouble(String.valueOf(child.getValue()));
                    }
                    if (child.getKey().equalsIgnoreCase("1")) {
                        longit = Double.parseDouble(String.valueOf(child.getValue()));
                    }
                }
                Log.e("!_@@__Lat Long ::", latati + " " + longit);
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {
                Log.e("!!__: ", "onCancelled ", firebaseError.toException());
            }
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    相关资源
    最近更新 更多