【问题标题】:java.lang.ClassCastException: java.lang.Double cannot be cast to java.lang.Long , when retrieve data from Firebasejava.lang.ClassCastException:从 Firebase 检索数据时,java.lang.Double 无法转换为 java.lang.Long
【发布时间】:2018-09-13 08:30:12
【问题描述】:

我的 Firebase 实时数据库中有十进制数字,但是当我检索到 long 值时。出错了

java.lang.ClassCastException: java.lang.Double 不能转换为 java.lang.Long

然后,我尝试将代码更改为 double。但它的错误如下:

java.lang.ClassCastException: java.lang.Long 无法转换为 java.lang.Double

但是当我将 Firebase 中的值更改为整数 ex: 70 时,它的表现很好并且显示值 70.0 和 long。

这是我的数据库 enter image description here

Java 类

 nilaiRef.child(keys).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                listNilai.clear();
                if(dataSnapshot.exists()){
                    for(DataSnapshot dataHasil : dataSnapshot.getChildren()){
                        final long nilai_temp = (long) dataHasil.child(users.getUid()).getValue(); 
======ERROR HERE=====
                        nilaiInfoRef.child(keys).child(dataHasil.getKey()).addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                if(dataSnapshot.exists()){
                                    NilaiMatakuliah nilai = dataSnapshot.getValue(NilaiMatakuliah.class);
                                    nilai.setNilai(nilai_temp);

                                    listNilai.add(nilai);
                                    mAdapter.notifyDataSetChanged();
                                    Log.e("nilais","1 "+nilai.getNilai());
                                    Log.e("nilais","2 "+nilai.getNama());
                                    Log.e("nilais","3 "+nilai.getSkala());
                                    Log.e("nilais","4 "+nilai.getBobot());


                                }else{

                                }
                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }
                        });

                    }
                }else{

                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

【问题讨论】:

  • 您存储double 值。要从double 获取long 值,例如使用Math.round()
  • nilaiRef 是如何声明的?
  • @ZamronyP.Juhara 但是当我更改为 double 时,它​​会强制转换 java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Double
  • 不要使用类型转换。

标签: java android firebase firebase-realtime-database


【解决方案1】:

也许您可以使用 java.lang.Long 的内置方法?

public double doubleValue()

如果你想将它保留为对象,那么实例化一个新的 java.lang.Double 呢?

Double myDouble = new Double (nilaiRef.doubleValue()) ;

转换已在doubleValue() 中为您完成。

【讨论】:

  • 我不明白,请你实现我的代码。
  • @yehezkielyehezkiel 我想问一下,你是从 Java 开始的吗?
  • 使用Double.valueOf(nilaiRef.doubleValue())t̶o̶̶k̶e̶p̶̶I̶D̶E̶̶f̶r̶o̶m̶̶n̶a̶g̶g̶i̶n̶g̶提高效率。
【解决方案2】:

查看您的数据库,您有两种类型的数据 Longdouble,我建议的第一件事是,当您将数据推送到数据库时,您应该将所有值转换为双精度,即使用 .0 推送它们如果他们是long

如果这不可能,您可以随时转换,假设您的值将在 double 范围内,您可以这样做:

final double nilai_temp = (double) dataHasil.child(users.getUid()).getValue();

注意:double 带有小号 d,您不能使用 Double(大写 D)进行这种投射。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-11
    • 2021-07-21
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    相关资源
    最近更新 更多