【问题标题】:Get Double From Firebase从 Firebase 获得双倍
【发布时间】:2021-05-31 03:39:38
【问题描述】:

我正在尝试使用 dataSnapshot 从 firebase 对象获取双精度,但每次尝试时,我都会收到一条错误消息,指出 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);

我希望使用 Double 从 firebase 检索总数,但它给了我 ClassCastException。请帮忙解决。 我也尝试在here 寻找解决方案,但没有找到任何解决方案

这是我从中查询的 FirebaseDatabase:

【问题讨论】:

  • 由于您获得了两种类型的ClassCastExceptions,我认为问题在于您尝试从中检索数据的节点有几个子节点Long 和其他子节点那是Double。请发布您的数据库结构。
  • @Rohan Stark。我现在才发...

标签: java android firebase firebase-realtime-database


【解决方案1】:

我想我可以从您的数据库截图中看出问题所在。您有一个total 节点的值为“5.16”。同时,另一个total 的值为“0”(我还假设您有更多的total 节点的值为“0”)。

所以,无论你做什么,你都会得到一个ClassCastException,因为“5.16”被视为Double,而“0”被视为Long——你在相同的查询。

最简单的解决方案是将“0”更改为“0.0”。这将使所有total 节点保持Double 值。然后,您只需调用以下命令来检索值:-

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

【讨论】:

  • 太棒了!万事如意
  • 如何存储 0.0 而不是 0?当我写 .setValue(0.0).setValue(new Double(0.0)) 时,它仍然存储为值为 0 的 Long。
【解决方案2】:

我是新手,可能是错的,我今天遇到了同样的问题,我能找到的唯一解决方法就是这个。

// 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
}

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-03-30
      • 2011-01-10
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多