我正在使用Firebase为Android应用程序实现一个数据库。
我提供2个bean:User.class
和Address.class
,由app使用:
@IgnoreExtraProperties
public class User {
@Exclude
private String idAccount;
private String firstname;
private String lastname;
private String pseudo;
private Address address;
private List<Qualification> qualification;
private boolean isWorker;
// Constructors + getters + setters
}
和
public class Address {
private String houseNumber;
private String street;
private String city;
private String zip;
private String country;
// Constructors + getters + setters
}
因此,我可以使用usersRef.child(idUser).setValue(user)
在数据库中添加用户,其中usersRef
是我对数据库中用户的引用(See result)
我也可以使用ValueEventListener
:
Query query = usersRef.child(idUser);
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User user = dataSnapshot.getValue(User.class);
result.call(user);
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException();
}
});
所以,现在一切正常!
但是,如果我尝试在ChildEventListener
上放usersRef
,我就会崩溃:
usersRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
User user = dataSnapshot.getValue(User.class); // crash here
}
}
...
}
致命例外:PID:29470 com.google.firebase.database.DatabaseException:无法转换对象 类型java.lang.String以键入ca.uqac.sosdoit.data.Address 在com.google.android.gms.internal.zzear.zzb(未知来源) 在com.google.android.gms.internal.zzear.zza(未知来源) 在com.google.android.gms.internal.zzear.zzb(未知来源) 在com.google.android.gms.internal.zzeas.zze(未知来源) 在com.google.android.gms.internal.zzear.zzb(未知来源) 在com.google.android.gms.internal.zzear.zza(未知来源) 在com.google.firebase.database.DataSnapshot.getValue(未知来源) 在 ca.uqac.sosdoit.database.DatabaseManager $ 1.onChildAdded(DatabaseManager.java:68) 在com.google.android.gms.internal.zzdri.zza(未知来源) 在com.google.android.gms.internal.zzdwu.zzbvb(未知来源) 在com.google.android.gms.internal.zzdxa.run(未知来源) 在android.os.Handler.handleCallback(Handler.java:808) 在android.os.Handler.dispatchMessage(Handler.java:103) 在android.os.Looper.loop(Looper.java:193) 在android.app.ActivityThread.main(ActivityThread.java:5292) at java.lang.reflect.Method.invokeNative(Native Method) 在java.lang.reflect.Method.invoke(Method.java:515) 在 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:824) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640) 在dalvik.system.NativeStart.main(本地方法)
我绝对不知道为什么
答案 0 :(得分:1)
该错误与Firebase试图将其中一个address
节点下的user
值编组到Address
类实例中有关。
数据库中的address
值应与您的类Address
匹配,但其中一个是无法转换为Address
实例的字符串。
如果address
值应该是字符串,则您需要将address
类的User
字段的类型更改为String
:< / p>
private String address;
否则,您需要检查数据库中user
下的每个节点是否存在错误地具有address
值字符串的任何节点。
答案 1 :(得分:1)
似乎一个(或一些)用户节点具有String类型的地址字段。用try catch包围它并记录节点的异常和键以找到罪魁祸首。
usersRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
try{
User user = dataSnapshot.getValue(User.class);
}
catch(DatabaseException e){
//Log the exception and the key
dataSnapshot.getKey();
}
}
...
}