从Firebase获得双倍

hm2xizp9  于 2023-05-01  发布在  其他
关注(0)|答案(4)|浏览(151)

我尝试使用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,我从这里查询:

wydwbb8l

wydwbb8l1#

我想我可以从你的数据库截图中看到问题。您有一个total节点的值为“5。16”。而另一个total的值是“0”(我还假设您有更多的total节点的值是“0”)。
所以,无论你做什么,你都会得到一个ClassCastException,因为“5.16”被视为Double,而“0”被视为Long-并且您在同一个查询中检索两者。
最简单的解决方法是将“0”更改为“0”。这将使所有total节点保持Double值。然后,你只需要调用下面的方法来检索值:

Double price = (Double) snapshot.child("total").getValue();
vlju58qv

vlju58qv2#

我是一个新手,可能是错的,我今天面临着同样的问题,我能找到的唯一变通方法是这个。

// I am trying to convert the required data
// I use Kotlin Langauage

fun getData(snapshot: DataSnapshot) : Double{

    val a :Any? = snapshot.child("required_data").value

    val b : Double = if(a != null && a.toString() != "0"){ 
        a as Double
     } else 0.0
    return b
}
r6hnlfcb

r6hnlfcb3#

这是因为0被视为并存储为Long,而不是Double。要使代码在这两种情况下都能工作,请执行以下操作:

double val = 0;
Number num = (Number) snapshot.child("total").getValue();
if (num != null) {
    val = num.doubleValue();
}
hwamh0ep

hwamh0ep4#

上面的答案使用了一个技巧,但我们可以使用类Number。它给出了一个内衬,这是一个更干净的:

val myDouble = (snapshot.child("data").value as Number).toDouble()

如果还想处理null值:

val myDouble = (snapshot.child("data").value as Number?)?.toDouble()
// myDouble: Double?

或合并为默认值:

val myDouble = (snapshot.child("data").value as Number?)?.toDouble() ?: 0.0

或者,如果你想要一个函数来完成这项工作:

fun getData(snapshot: DataSnapshot, defaultValue: Double = 0.0): Double {
    return (snapshot.value as Number?)?.toDouble() ?: 0.0
}

请注意,如果数据不是基于数字的,它仍然会崩溃。

相关问题