无法转换来自Firebase的数据

时间:2019-01-06 11:45:18

标签: android firebase-realtime-database casting

我正在从Firebase数据库中检索孩子的数据,引用后的第一个孩子是我用mRoot到达的“汽车” 然后我使用迭代的方式覆盖“汽车”中的每个孩子 然后我将数据输入汽车类 首先,我用字符串值创建了类,然后它说您不能将长值转换为字符串 然后我把它变成long,它说你不能把字符串值转换成long

  

com.google.firebase.database.DatabaseException:无法将类型java.lang.Long的值转换为String                         com.google.android.gms.internal.firebase_database.zzkt.zzb(未知来源)                         com.google.android.gms.internal.firebase_database.zzkt.zza上(未知来源)                         位于com.google.firebase.database.DataSnapshot.getValue(未知来源)                         在com.example.ahmed.pointoflife.LogIn $ 1 $ 1.onDataChange(LogIn.java:55)

更改时

  

com.google.firebase.database.DatabaseException:无法将类型java.lang.String的值转换为long                         com.google.android.gms.internal.firebase_database.zzkt.zzb(未知来源)                         com.google.android.gms.internal.firebase_database.zzkt.zza上(未知来源)                         位于com.google.firebase.database.DataSnapshot.getValue(未知来源)                         在com.example.ahmed.pointoflife.LogIn $ 1 $ 1.onDataChange(LogIn.java:55)

mRoot.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
                    Car car = new Car();
                    car.setHospital(childSnapshot.child("hospital").getValue(Long.class));
                    car.setId(childSnapshot.child("id").getValue(Long.class));
                    car.setPassword(childSnapshot.child("password").getValue(Long.class));
                    h.put(car.getId().toString(),car);
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });


package com.example.ahmed.pointoflife;
import com.google.firebase.database.PropertyName;
public class Car {

    private Long hospital,id,password;
    public Car(Long hospital,Long id,Long passowrd)
    {
     this.hospital = hospital;
     this.id = id;
     this.password = passowrd;

    }
    Car(){

    }

    @PropertyName("hospital")
    public Long getHospital() {
        return hospital;
    }

    public void setHospital(Long hospital) {
        this.hospital = hospital;
    }

    @PropertyName("id")
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    @PropertyName("password")
    public Long getPassword() {
        return password;
    }

    public void setPassword(Long password) {
        this.password = password;
    }
}

火力树 https://drive.google.com/file/d/17xYkrFwZqscCdrzvfkStr6cC-VYaQHI1/view?usp=sharing

我该如何从Firebase中正确获取这些值而没有麻烦

1 个答案:

答案 0 :(得分:1)

假设mRoot指向Firebase根目录,要解决此问题,请更改以下代码行:

mRoot.addValueEventListener(*/ ... */);

mRoot.child("cars").addValueEventListener(*/ ... */);

要获取Car对象,您可以简单地使用:

Car car = childSnapshot.getValue(Car.class);

编辑:现在,您可以更清楚地看到整个数据库结构。因此,为解决此问题,请使用以下代码行:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference carsRef = rootRef.child("cars");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            Car car = ds.getValue(Car.class);
            Log.d(TAG, car.getHospital());
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
carsRef.addListenerForSingleValueEvent(valueEventListener);

您的logcat中的输出将为:11

或者使用Long类以更简单的方式:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference carsRef = rootRef.child("cars");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            Long hospital = ds.child("hospital").getValue(Long.class);
            Log.d(TAG, hospital);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
carsRef.addListenerForSingleValueEvent(valueEventListener);

输出将相同。

也无需使用@PropertyName,因为该类中的所有字段都与数据库中的文件字段匹配。