Android 如何在firebase数据库中将零保存为双精度
在我的数据库中,我跟踪用户行驶的距离,并为每个人设置初始值0。在我的代码中,我通过获取旧值并向其添加新距离来更新该值,然后保存该值 首先,当我从数据库检索0时,它将作为Long返回,这很好:Android 如何在firebase数据库中将零保存为双精度,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,在我的数据库中,我跟踪用户行驶的距离,并为每个人设置初始值0。在我的代码中,我通过获取旧值并向其添加新距离来更新该值,然后保存该值 首先,当我从数据库检索0时,它将作为Long返回,这很好: @Override public void onDataChange(DataSnapshot dataSnapshot) { Long previousDistance = (Long) dataSnapshot.child("distance").getValue(); userRefe
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Long previousDistance = (Long) dataSnapshot.child("distance").getValue();
userReference.child("distance").setValue(previousDistance.doubleValue()+distanceTravelled);
}
问题是,现在存储在数据库中的值是双精度的,因此下次运行上述代码时,它将以classcastexcegmetan
失败
我可能可以用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 previousDistance = (double) dataSnapshot.child("distance").getValue();
你应该把它说成是正常的:
myDatabase.child("users").child(lowerCaseUserName).child("distance").setValue(0);
我猜无论数字中是否有浮点数,它都会被计算为零,因此您可以添加一个接近零的值,但使用一个有意义的浮点数。根据您所需的精度,这不会有任何影响
…子(“距离”).setValue(0.0000000001)代码>
否则,将其存储为字符串,并在每次使用该值时转换回double
我也找不到另一种方法,它会自动转换为Long,就像你说的那样…它不是存储为“0”(字符串),而是存储为数字0。在Firebase中,存储什么类型的primitve并不重要,只要它是0(零)。如果将现有值0(零)和0.01相加,结果将是:0.01
,这显然是一个双精度值
要记住的一点是,从数据库中获取数据的时间与存储数据的时间相同。如果使用此行代码将值设置为双精度:
myDatabase.child("users").child(lowerCaseUserName).child("distance").setValue(0.01);
double previousDistance = dataSnapshot.child("distance").getValue(Double.class);
如果只需要0(零),则只能使用:
myDatabase.child("users").child(lowerCaseUserName).child("distance").setValue(0);
要将其取回,您需要使用以下代码行:
myDatabase.child("users").child(lowerCaseUserName).child("distance").setValue(0.01);
double previousDistance = dataSnapshot.child("distance").getValue(Double.class);
请记住,firebase是一个基于JSON树节点的系统。您应该一直使用包装器将其序列化为JSON。JSON只支持firebase的长数值,这就是异常不断发生的原因
很好的做法是实现一个方法,其形式为SerializeDoubleToString()
和逆反序列化stringtodouble()
存储双重字符串;您对数字的分辨率有很大的影响,Unity主要是浮点32b,而firebase 64。我已经尝试过了,但是我会得到一个ClassCastException,因为.child(“distance”).setValue(0)
将其存储为Long。我想您第一次将其保存为Long
。从firebase控制台中删除该节点并重试。我没有选择将其保存为Long
,firebase会自动执行此操作。无论如何,我照你说的做了,我仍然得到java.lang.ClassCastException:java.lang.Long不能转换为java.lang.Double
你试过Double previousDistance=dataSnapshot.child(“距离”).getValue(Double.class)代码>?我想在数据库中存储0.0(双精度),但我想这是不可能的。不能将值存储为0.0
。因为自动转换为<代码> 0 <代码>。如果您仍然认为我的答案对您有帮助,请考虑接受并投票表决。谢谢@BuntuLinux是的,很好。如果你认为我的回答对你有帮助,请考虑投票表决。我会很感激的。谢谢这是一个bug或者至少是有缺陷的设计。在C#中设置数据时,运行时知道数字的确切类型(是double、float、long、int等)。Firebase正在将数字转换为Long或Double。显然,他们是根据是否有小数位数来做的,因为单独根据类型进行转换更有意义。所以float和double将转换为double,所有int类型都将转换为Long。当前的行为虽然可以解释,但很奇怪,会导致保存和检索浮动不必要的复杂性。