从DataSnapshot获取对象时出错

时间:2017-11-08 17:50:45

标签: android firebase firebase-realtime-database

我正在使用Firebase为Android应用程序实现一个数据库。

我提供2个bean:User.classAddress.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();
            }
        });

See result

所以,现在一切正常!

但是,如果我尝试在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(本地方法)

我绝对不知道为什么

2 个答案:

答案 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();
            }
         }

            ...

}