如何在firebase数据库中将零保存为Double

时间:2017-11-06 15:33:13

标签: android firebase firebase-realtime-database

在我的数据库中,我正在跟踪用户行进的距离,并为每个人设置初始值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?

4 个答案:

答案 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。