Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在firebase数据库中将零保存为双精度_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android 如何在firebase数据库中将零保存为双精度

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

在我的数据库中,我跟踪用户行驶的距离,并为每个人设置初始值0。在我的代码中,我通过获取旧值并向其添加新距离来更新该值,然后保存该值

首先,当我从数据库检索0时,它将作为Long返回,这很好:

@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。当前的行为虽然可以解释,但很奇怪,会导致保存和检索浮动不必要的复杂性。