我正在从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中正确获取这些值而没有麻烦
答案 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
,因为该类中的所有字段都与数据库中的文件字段匹配。