我尝试使用dataSnapshot从firebase对象中获取一个double,但每次我尝试时,我都会得到一个错误,说java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double
,当我尝试将其转换为Long时,只是为了观察会发生什么,我得到这个错误java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Long
,所以简而言之,错误是反之亦然。这是我用来在Firebase dataSnapshot中获取总数的代码:
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上保存总数的代码:
double total = holder.quantity * price;
dataSnapshot.child(code).child("total").getRef().setValue(total);
我希望检索总从firebase使用Double
,但它给我的ClassCastException
。请帮助解决方案。我也试着在这里寻找解决方案,但没有找到任何东西
这是我的FirebaseDatabase,我从这里查询:
4条答案
按热度按时间wydwbb8l1#
我想我可以从你的数据库截图中看到问题。您有一个
total
节点的值为“5。16”。而另一个total
的值是“0”(我还假设您有更多的total
节点的值是“0”)。所以,无论你做什么,你都会得到一个
ClassCastException
,因为“5.16”被视为Double
,而“0”被视为Long
-并且您在同一个查询中检索两者。最简单的解决方法是将“0”更改为“0”。这将使所有
total
节点保持Double
值。然后,你只需要调用下面的方法来检索值:vlju58qv2#
我是一个新手,可能是错的,我今天面临着同样的问题,我能找到的唯一变通方法是这个。
r6hnlfcb3#
这是因为0被视为并存储为Long,而不是Double。要使代码在这两种情况下都能工作,请执行以下操作:
hwamh0ep4#
上面的答案使用了一个技巧,但我们可以使用类
Number
。它给出了一个内衬,这是一个更干净的:如果还想处理
null
值:或合并为默认值:
或者,如果你想要一个函数来完成这项工作:
请注意,如果数据不是基于数字的,它仍然会崩溃。