从DataSnapshot获取对象时出错 [英] Error when getting an object from DataSnapshot

查看:46
本文介绍了从DataSnapshot获取对象时出错的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am implementing a database with Firebase for an android application.

我展示了2个bean: User.class Address.class ,由应用程序使用:

I present 2 beans : User.class and Address.class, using by the 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 是我在数据库(查看结果)

So, I can add an user in the database with usersRef.child(idUser).setValue(user), where usersRef is my reference of the users in the database (See result)

我还可以使用 ValueEventListener 来获取用户:

I can also get the user with a 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();
            }
        });

(查看结果)

所以,目前一切正常!

但是,如果我尝试在 usersRef 上放置 ChildEventListener ,则会发生崩溃:

But, if I try to put a ChildEventListener on my usersRef, I have a crash :

 usersRef.addChildEventListener(new ChildEventListener() {

            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                User user = dataSnapshot.getValue(User.class); // crash here
                }
            }

            ...

}

致命异常:PID:29470com.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)在java.lang.reflect.Method.invokeNative(本机方法)在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(本机方法)

FATAL EXCEPTION: PID: 29470 com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type ca.uqac.sosdoit.data.Address at com.google.android.gms.internal.zzear.zzb(Unknown Source) at com.google.android.gms.internal.zzear.zza(Unknown Source) at com.google.android.gms.internal.zzear.zzb(Unknown Source) at com.google.android.gms.internal.zzeas.zze(Unknown Source) at com.google.android.gms.internal.zzear.zzb(Unknown Source) at com.google.android.gms.internal.zzear.zza(Unknown Source) at com.google.firebase.database.DataSnapshot.getValue(Unknown Source) at ca.uqac.sosdoit.database.DatabaseManager$1.onChildAdded(DatabaseManager.java:68) at com.google.android.gms.internal.zzdri.zza(Unknown Source) at com.google.android.gms.internal.zzdwu.zzbvb(Unknown Source) at com.google.android.gms.internal.zzdxa.run(Unknown Source) at android.os.Handler.handleCallback(Handler.java:808) at android.os.Handler.dispatchMessage(Handler.java:103) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:5292) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:515) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640) at dalvik.system.NativeStart.main(Native Method)

我绝对不知道为什么

推荐答案

似乎一个(或一些)用户节点的地址字段为String类型.用try catch包围它,并记录节点的异常和键以查找罪魁祸首.

Seems like one(or some) of the User nodes has an address field of type String. Surround it with try catch and log both the exception and key of the node to find the culprit(s).

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

            ...

}

这篇关于从DataSnapshot获取对象时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆