【问题标题】:Error when getting an object from DataSnapshot从 DataSnapshot 获取对象时出错
【发布时间】:2017-11-08 17:50:44
【问题描述】:

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

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

@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)

所以,现在一切正常!

但是,如果我尝试在我的usersRef 上添加一个ChildEventListener,我就会崩溃:

 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) 在 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(Native Method)

我完全不知道为什么

【问题讨论】:

  • 尝试使用Map&lt;String, String&gt; valueMap = (HashMap&lt;String, String&gt;) dataSnapshot.getValue();调试,找到地址节点。

标签: android firebase firebase-realtime-database


【解决方案1】:

似乎一个(或一些)用户节点有一个字符串类型的地址字段。用 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();
            }
         }

            ...

}

【讨论】:

  • 是的,就是这样!出于某种原因,旧节点有一个字符串作为地址:/ 谢谢!!
【解决方案2】:

该错误与 Firebase 试图将 user 节点之一下的 address 值编组为 Address 类实例有关。

数据库中的address 值应与您的类Address 匹配,但其中一个是无法转换为Address 实例的字符串。

如果address 值应该是字符串,您需要将User 类上的address 字段的类型更改为String:

private String address;

否则,您需要检查数据库中user 下的每个节点,以查找错误地包含address 值字符串的任何节点。

【讨论】:

    猜你喜欢
    • 2018-01-19
    • 1970-01-01
    • 2021-12-02
    • 2021-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 2023-04-09
    相关资源
    最近更新 更多