我不知道这是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
知道为什么会这样吗?
答案 0 :(得分:2)
如果您将float
存储到Firebase中,它将以Double
或Long
的形式返回。
这将有效:
// ...
@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) ...
}
//...