在我的数据库中,我正在跟踪用户行进的距离,并为每个人设置初始值0。在我的代码中,我通过获取旧值并向其添加新距离来更新此值,然后保存该值。
首先,当我从数据库中检索0时,它返回为Long,这很好:
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Long previousDistance = (Long) dataSnapshot.child("distance").getValue();
userReference.child("distance").setValue(previousDistance.doubleValue()+distanceTravelled);
}
问题是,现在,存储在数据库中的值是Double,因此下次运行上面的代码时,它将失败并显示ClassCastExcepiton
。
我可以使用if语句解决问题,但最简单的解决方案是将初始0存储为Double。但是,我无法做到这一点。我试过这两个:
myDatabase.child("users").child(lowerCaseUserName).child("distance").setValue(Double.valueOf(0.0));
myDatabase.child("users").child(lowerCaseUserName).child("distance").setValue(0.0);
它们仍然存储为“0”并返回为Long。是否可以在数据库中将零存储为Double?
答案 0 :(得分:2)
它不存储为“0”(字符串),它存储为数字0.在Firebase中,只要它是0(零),无论你存储什么样的原始数据都无关紧要。如果您添加到现有值0(零),0.01,结果将是: 0.01
,这显然是一个Double。
要记住的一件事是将数据库中的数据与您存储的数据相同。如果您使用以下代码行将值设置为Double:
myDatabase.child("users").child(lowerCaseUserName).child("distance").setValue(0.01);
如果您只想要0(零),则只能使用:
myDatabase.child("users").child(lowerCaseUserName).child("distance").setValue(0);
要获得它,你需要使用这行代码:
double previousDistance = dataSnapshot.child("distance").getValue(Double.class);
答案 1 :(得分:0)
double previousDistance = (double) dataSnapshot.child("distance").getValue();
你应该正常地说:
myDatabase.child("users").child(lowerCaseUserName).child("distance").setValue(0);
答案 2 :(得分:0)
我猜它是否被评估为零,无论数字中是否有浮点,所以你可以添加一个接近于零的值,但是有一个有意义的浮点。根据您所需的精度,这不会受到伤害。
<div class="about_me">
<p>About me<img class="pencil" src="assets/pencil.png" alt=""></p>
<div class="about_me_content">
some information..
</div>
</div>
否则,每次使用该值时,将其存储为String并转换回double。
我找不到另一种方法,它就像你说的那样自动自动投射到Long ......
答案 3 :(得分:0)
请记住,firebase是基于JSON树节点的系统。您应该一直使用包装器将其序列化为JSON。 JSON仅支持将数值作为Firebase,因此这就是一遍又一遍地发生异常的原因。
以SerializeDoubleToString()
和反DeserializeStringToDouble()
的形式实现方法是一种很好的做法。
将Doubles存储为字符串;您会对数字的解析度产生巨大的影响,Unity主要是浮点32b,而Firebase是64。