我正在尝试使用dataSnapshot从firebase对象获取一个双精度但是每次我尝试时,我都会收到一个错误,说java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Long
并且当我尝试将它强制转换为Long时只是为了观察什么是我会得到这个错误 mDatabaseReference.child(mAuth.getCurrentUser().getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (!isPrinted) {
System.out.println("Children" + dataSnapshot.getChildrenCount());
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
Double price = (Double) snapshot.child("total").getValue();
System.out.println("Price: " + String.valueOf(price));
}
isPrinted = true;
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
,所以简而言之,错误反之亦然。这是我用来在Firebase dataSnapshot中获取总数的代码:
double total = holder.quantity * price;
dataSnapshot.child(code).child("total").getRef().setValue(total);
这是我用来保存firebase总数的代码:
Double
我希望使用ClassCastException
从firebase检索总数,但它会给我select XMLELEMENT("PERSONS",
。请帮助解决方案。
我也试过寻找http://jshint.com/docs/的解决方案,但没找到任何东西
这是我要查询的Firebase数据库:here
答案 0 :(得分:2)
我想我可以从您的数据库截图中看到问题。您有一个total
节点的值为" 5.16"。而另一个total
的值是" 0" (我还假设您有更多total
个节点,其值为" 0")。
所以,无论你做什么,你都会获得ClassCastException
,因为" 5.16"被视为Double
,而" 0"被视为Long
- 并且您在同一查询中检索两者。
最简单的解决方案是改变你的" 0"到" 0.0"。这将使所有total
个节点保持Double
个值。然后,您只需调用以下内容来检索值: -
Double price = (Double) snapshot.child("total").getValue();
答案 1 :(得分:1)
我是新手,可能是错的,我今天遇到了同样的问题,我能找到的唯一解决方法就是这个。
// I am trying to convert the required data
// I use Kotlin Langauage
fun getData(snapshot: DataSnapshot) : Double{
val a :Any? = snapshot.child("required_data").value
val b : Double = if(a != null && a.toString() != "0"){
a as Double
} else 0.0
return b
}
答案 2 :(得分:0)
这是因为0被视为并存储为Long,而不是Double。要使代码在两种情况下都能正常工作,请执行以下操作:
double val = 0;
Number num = (Number) snapshot.child("total").getValue();
if (num != null) {
val = num.doubleValue();
}