Java addChildEventListener在addValueEventListener提供datasnapshot的值时显示错误。为什么?

Java addChildEventListener在addValueEventListener提供datasnapshot的值时显示错误。为什么?,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,数据库结构是 此listner为模型类提供了值 ref.child(stateName).child(cityName).child("business").child(user).child("counter").addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) {

数据库结构是

此listner为模型类提供了值

 ref.child(stateName).child(cityName).child("business").child(user).child("counter").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {


            ShopCategoryModel  Smodel =  dataSnapshot.getValue( ShopCategoryModel.class);




            servicetype = Smodel.getServicetype();
            int orderleft = Smodel.getOrderleft();
            int uploadsleft = Smodel.getUploadsleft();
            int referralpionts = Smodel.getReferralpionts();
            renewaldate = Smodel.getRenewaldate();
            int vistors = Smodel.getVisitors();
            int ratings = Smodel.getRatings();

            ac_TotalVisitors.setText(""+vistors);
            ac_ratingBar.setRating(Float.parseFloat(String.valueOf(ratings)));
            ac_Shope_ratings.setText(""+ratings);

            ac_orderleft.setText(""+orderleft);
            ac_Uploadsleft.setText(""+uploadsleft);
            ac_Referralpoints.setText(""+referralpionts);
            ac_renewdate.setText(renewaldate);








            }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
应用addChildEventListener时显示错误

 ref.child(stateName).child(cityName).child("business").child(user).child("counter").addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {


            ShopCategoryModel  Smodel =  dataSnapshot.getValue( ShopCategoryModel.class);



            servicetype = Smodel.getServicetype();
            int orderleft = Smodel.getOrderleft();
            int uploadsleft = Smodel.getUploadsleft();
            int referralpionts = Smodel.getReferralpionts();
            renewaldate = Smodel.getRenewaldate();

            int vistors = Smodel.getVisitors();
            int ratings = Smodel.getRatings();

            ac_TotalVisitors.setText(""+vistors);
            ac_ratingBar.setRating(Float.parseFloat(String.valueOf(ratings)));
            ac_Shope_ratings.setText(""+ratings);

            ac_orderleft.setText(""+orderleft);
            ac_Uploadsleft.setText(""+uploadsleft);
            ac_Referralpoints.setText(""+referralpionts);
            ac_renewdate.setText(renewaldate);


        }

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

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

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

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
在这之后,我得到了这个错误

 Process: mahendergarh.bhupendra.shaharseller, PID: 18837
                                                                                 com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.Long to type mahendergarh.bhupendra.shaharseller.model.ShopCategoryModel
                                                                                     at com.google.android.gms.internal.adw.zzb(Unknown Source)
                                                                                     at com.google.android.gms.internal.adw.zza(Unknown Source)
                                                                                     at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
                                                                                     at mahendergarh.bhupendra.shaharseller.Sign_in.Account$3.onChildAdded(Account.java:255)
                                                                                     at com.google.android.gms.internal.uv.zza(Unknown Source)
                                                                                     at com.google.android.gms.internal.aaf.zzIo(Unknown Source)
                                                                                     at com.google.android.gms.internal.aal.run(Unknown Source)
                                                                                     at android.os.Handler.handleCallback(Handler.java:746)
                                                                                     at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                     at android.os.Looper.loop(Looper.java:148)
                                                                                     at android.app.ActivityThread.main(ActivityThread.java:5443)
                                                                                     at java.lang.reflect.Method.invoke(Native Method)
                                                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
                                                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
我在不同的时间使用每个侦听器。
请告诉我发生这种情况的原因,为什么我在addChildEventListener中遇到模型类错误。提前完成任务

A
ChildEventListener
为附加位置下的每个子项激发,而
ValueEventListener
为位置本身激发

因此,如果将侦听器附加到数据库中的同一位置,则会使用节点的各个属性触发
onchildaded
。因此,
date
orderLeft
,等等


如果您有一个查询或集合,而这里没有,您通常需要一个
ChildEventListener

没有看到错误,您可以发布stacktrace吗?我只是添加了一个eRoom,或者因为我不知道firebase数据库的结构,您是否在onChildChanged()中尝试过相同的代码?是的,我在两个列表器中找到了相同的节点。。。。你现在可以看到我的结构了,所以我们无法用ChildEventListener查看Normal数据节点???但我想做些改变。我现在应该用什么?我不明白你想用
ChildEventListener
实现什么。如果这有帮助:
ValueEventListener.onDataChange
在附加侦听器时立即使用当前值激发。我想在onDataChange中设置一个条件(如果有其他条件),但ValueEvent的问题是,它会在每次创建acitvity时触发数据,并且该条件也会在数据库中没有任何数据更改的情况下开始工作,这就是我想使用“ChildEventListener”的原因。因此,建议我在活动重新启动时,立即对所有现有属性重新触发
onchildaded
。因此,让我们忽略
ChildEventListener
,它只对集合和查询有用,您现在正在尝试的也不是。您是否只希望在数据发生实际更改时获得回调?你是如何在你的应用程序中使用它的?您是否将当前值存储在某个位置?实际上,我的值已存储在数据库中。我想在活动开始时首先获取存储的值,我想在数据被更改时(当字符串被更改时)设置一个条件,如果(string.equals(“something”){do something})