在Firebase数据库查询上使用addChildEventListener

时间:2018-09-01 17:47:07

标签: android firebase firebase-realtime-database

我正在使用addChildEventListener作为聊天应用程序

Query chatRoot = Qref
            .child("Messages")
            .orderByChild("lobbykey")
            .equalTo(lobbykey);`

这是我正在使用的查询,据我所知,它的工作原理不错 我正在尝试做的。我还有一个构造函数类,用于放置对象:

public ChatParameters(String userUID, String message, String imageURL, String sender, String lobbykey, String msgkey) {
    this.UserUID = userUID;
    this.sender = sender;
    this.message = message;
    this.imageURL = imageURL;
    this.lobbykey = lobbykey;
    this.msgkey = msgkey;
}

onchildapped侦听器工作正常。当我只用Toast尝试时,它会使文本工作正常。但是当我添加Chatparameters.class以获取所有值时,它就会崩溃

public void onChildAdded(DataSnapshot dataSnapshot, String s) {
  for (DataSnapshot chatSnapshot: dataSnapshot.getChildren()){
    ChatParameters chatParameters = chat.getValue(ChatParameters.class); //i get the error here.
  }
}

这是错误logcat,它指的是ChatParameters chatParameters = chat.getValue(ChatParameters.class);

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.woofy_nocco.testapp.ChatParameters
    at com.google.android.gms.internal.zzelw.zzb(Unknown Source)
    at com.google.android.gms.internal.zzelw.zza(Unknown Source)
    at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
    at com.example.woofy_nocco.testapp.Chatroom$1.onChildAdded(Chatroom.java:78)
    at com.google.android.gms.internal.zzecw.zza(Unknown Source)
    at com.google.android.gms.internal.zzeia.zzbyc(Unknown Source)
    at com.google.android.gms.internal.zzeig.run(Unknown Source)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:148)

这就是我的数据库结构

database.png

1 个答案:

答案 0 :(得分:1)

您的onChildAdded的{​​{1}}方法已在各个子节点上调用。因此,很可能您不需要在其中循环ChildEventListener

dataSnapshot.getChildren()

问题的说明: 通过遍历public void onChildAdded(DataSnapshot dataSnapshot, String s) { ChatParameters chatParameters = dataSnapshot.getValue(ChatParameters.class); } dataSnapshot.getChildren()最终将指向聊天消息的各个属性。因此,如果您的chatSnapshotChatParameters属性和text属性组成,则message将指向该chatSnapshottext属性, message将是一个字符串。由于无法将chatSnapshot.getValue()转换为您的String类,因此SDK会引发异常。