尝试从Firebase中获取HashMap String,Object时获取Double值时出错

时间:2016-05-07 20:39:48

标签: android casting hashmap firebase double

我不知道这是Firebase错误,Android错误还是我的错。我的问题是,由于某些原因,我无法在获取子项时从Hashmap获取Double值。为什么?因为

java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double

显然,存储在firebase json对象中的每个数值都将从HashMap返回为Long。更奇怪的是什么?使用调试器,我实际上发现Android Studio知道它们有点双/浮动,实际上如果要获取的值是2.5,它会打印出key#34; string"的hashmap的值。是2.5。

将此值分配给我的double变量时,会打印出上面的错误。

这是代码

final double[] rating = {0};
final int[] nRatings = {0};
Firebase ref = new Firebase("https://MYAPP.firebaseio.com/reviews");
Query queryRef = ref.orderByChild("idCommented").equalTo(mId);
queryRef.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot snapshot, String previousChild) {
        System.out.println(snapshot.getKey());

        Map map = (HashMap) snapshot.getValue();
        rating[0] += (double) map.get("noStars"); // This line causes error
        nRatings[0]++;

        mRatingBar.setRating((float)rating[0]/nRatings[0]);
    }
...
});

但是,如果我应该调试那个迭代来检查映射值,那么它将打印出Long不能强制转换为Double

知道为什么会这样吗?

1 个答案:

答案 0 :(得分:2)

如果您将float存储到Firebase中,它将以DoubleLong的形式返回。

这将有效:

// ...
@Override
public void onChildAdded(DataSnapshot snapshot, String previousChild) {

    Number priceN = (Number) snapshot.getValue(); // Long or Double
    float price = priceN.floatValue();

    // (do whatever you want with the float) ...

}
//...