简体   繁体   中英

I am trying to retrieve data from my firebase database using getter and setter but getting an error says can't convert the object

I am trying to create a group activity in which all the groups to which the user is connected can be shown over this activity. I have created the group activity and insert the recycler view in it and tried to retrieve the data from the database but unfortunately, I am getting errors when I run my application on my android phone. the application gets crashed and in the logcat, I got the message says Can't convert an object of type java.lang.String to type com.nanb.alpha.modelclass. if you don't mind please help me so that I can complete my activity.

below code are the code where user can create a group.

      private void groupmethos(final String groupname) {
    DatabaseReference groupref = rootref.child("Group").push();
    final String grouppushid = groupref.getKey();
    Map groupmap = new HashMap<>();
    groupmap.put("GroupprofileName",groupname);
    groupmap.put("Creater",currentUser.getUid());
    groupmap.put("StatusGroup","");
    groupmap.put("profileimage","");
    groupmap.put("id",grouppushid);
    rootref.child("Group").child(grouppushid).updateChildren(groupmap).addOnCompleteListener(new OnCompleteListener() {
        @Override
        public void onComplete(@NonNull Task task) {
            rootref.child("GroupMessage").child(grouppushid).setValue("").addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if (task.isSuccessful()){
                        rootref.child("userconnectedtogroup").child(currentUser.getUid()).child(grouppushid).setValue("Added").addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                Toast.makeText(MainActivity.this,groupname + "group Created successfully",Toast.LENGTH_SHORT).show();
                            }
                        });

                    }
                }
            });

        }
    });
  }

in the above codes, the user requests to create a group. given below are the codes where the data fetch from the database using getter and setter.

  package com.nanb.alpha;

public class modelclass {
private String GroupprofileName,StatusGroup,profileimage;

public modelclass() {
}

public modelclass(String groupprofileName, String statusGroup, String profileimage) {
    this.GroupprofileName = groupprofileName;
    this.StatusGroup = statusGroup;
    this.profileimage = profileimage;
}

public String getGroupprofileName() {
    return GroupprofileName;
}

public void setGroupprofileName(String groupprofileName) {
    GroupprofileName = groupprofileName;
}

public String getStatusGroup() {
    return StatusGroup;
}

public void setStatusGroup(String statusGroup) {
    StatusGroup = statusGroup;
}

public String getProfileimage() {
    return profileimage;
}

public void setProfileimage(String profileimage) {
    this.profileimage = profileimage;
}
}

given code is the code where recyclerview works to set the value to the layout given.

     public class group extends AppCompatActivity {

     private RecyclerView recyclerView;
     private DatabaseReference conref,groupref;
     private FirebaseAuth mAuth;
     private String Currentuserid;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_group);

    intialiation();
    mAuth = FirebaseAuth.getInstance();
    Currentuserid = mAuth.getCurrentUser().getUid();
    conref = FirebaseDatabase.getInstance().getReference().child("userconnectedtogroup").child(Currentuserid);
    groupref = FirebaseDatabase.getInstance().getReference().child("Group");
    }

    private void intialiation() {
    recyclerView = findViewById(R.id.recyclerview);
    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    recyclerView.setLayoutManager(layoutManager);
    }

     @Override
     protected void onStart() {
    super.onStart();
    FirebaseRecyclerOptions option = new FirebaseRecyclerOptions.Builder<modelclass>().setQuery(conref,modelclass.class).build();

    FirebaseRecyclerAdapter<modelclass,group_viewHolder> adapter = new FirebaseRecyclerAdapter<modelclass, group_viewHolder>(option) {
        @Override
        protected void onBindViewHolder(@NonNull final group_viewHolder group_viewHolder, int i, @NonNull modelclass modelclass) {
            String userid = getRef(i).getKey();
            groupref.child(userid).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                  if(dataSnapshot.hasChild("profileimage")){
                      String profileimage = dataSnapshot.child("profileimage").getValue().toString();
                      String groupname = dataSnapshot.child("GroupprofileName").getValue().toString();
                      String groupStatus = dataSnapshot.child("StatusGroup").getValue().toString();

                      group_viewHolder.groupname.setText(groupname);
                      group_viewHolder.groupStatus.setText(groupStatus);
                      Picasso.get().load(profileimage).into(group_viewHolder.profileimage);
                  }else{
                      String groupname = dataSnapshot.child("GroupprofileName").getValue().toString();
                      String groupStatus = dataSnapshot.child("StatusGroup").getValue().toString();

                      group_viewHolder.groupname.setText(groupname);
                      group_viewHolder.groupStatus.setText(groupStatus);
                      Picasso.get().load(R.mipmap.groupicon).into(group_viewHolder.profileimage);
                  }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });
        }

        @NonNull
        @Override
        public group_viewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
           View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.grouplayout,parent,false);
           group_viewHolder groupholder = new group_viewHolder(view);
            return groupholder;
        }
    };
    recyclerView.setAdapter(adapter);
    adapter.startListening();
    }

    public static class group_viewHolder extends RecyclerView.ViewHolder{
    TextView groupname,groupStatus;
    CircleImageView profileimage;
    public group_viewHolder(@NonNull View itemView) {
        super(itemView);
        groupname = itemView.findViewById(R.id.Group_name);
        groupStatus = itemView.findViewById(R.id.Group_Status);
        profileimage = itemView.findViewById(R.id.group_profile_dp);
    }
    }
    }

given below is the image of my firebase database. Which shows all the structures related to group activity. 群组包含与群组相关的所有信息,如管理员 ID、群组名称等。群组消息部分将包含将在该群组内共享的消息。 Userconnectedtogroup 包含用户连接或添加到的组的 ID。

Below is the logcat message that is been shown after the application gets crashed.

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.nanb.alpha.modelclass at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(com.google.firebase:firebase-database@@19.1.0:418) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(com.google.firebase:firebase-database@@19.1.0:214) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(com.google.firebase:firebase-database@@19.1.0:79) at com.google.firebase.database.DataSnapshot.getValue(com.google.firebase:firebase-database@@19.1.0:203) at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:29) at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:15) at com.firebase.ui.common.BaseCachingSnapshotParser.parseSnapshot(BaseCachingSnapshotParser.java:35) at com.firebase.ui.common.BaseObservableSnapshotArray.get( BaseObservableSnapshotArray.java:52) at com.firebase.ui.database.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:106) at com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:122) at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781) at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823) at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5752) at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6019) at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858) at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854) at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230) at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk( LinearLayoutManager.java:1557) at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517) at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612) at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924) at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3641) at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4194) at android.view.View.layout(View.java:15689) at android.view.ViewGroup.layout(ViewGroup.java:5048) at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1915) at android.view.View.layout(View.java:15689) at android.view.ViewGroup.layout(ViewGroup.java:5048) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) at android.widget.FrameLayout.onLayout(FrameLayout.java:514) at android.view.View.layout(View.java:15689) at android.view.ViewGroup.layout(ViewGroup.java:5048) at android.widge t.LinearLayout.setChildFrame(LinearLayout.java:1703) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557) at android.widget.LinearLayout.onLayout(LinearLayout.java:1466) at android.view.View.layout(View.java:15689) at android.view.ViewGroup.layout(ViewGroup.java:5048) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) at android.widget.FrameLayout.onLayout(FrameLayout.java:514) at android.view.View.layout(View.java:15689) at android.view.ViewGroup.layout(ViewGroup.java:5048) at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703) at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557) at android.widget.LinearLayout.onLayout(LinearLayout.java:1466) at android.view.View.layout(View.java:15689) at android.view.ViewGroup.layout(ViewGroup.java:5048) at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) at android.widget.FrameLayout.onLayout(FrameLayout.java:514) at android

Your userconnectedtogroup in database doesn't contain model, it contains string like Added . Update your query like below:

FirebaseRecyclerOptions option = new FirebaseRecyclerOptions.Builder<String>().setQuery(conref,String.class).build();
FirebaseRecyclerAdapter<String,group_viewHolder> adapter = new FirebaseRecyclerAdapter<String, group_viewHolder>(option) {
    @Override
    protected void onBindViewHolder(@NonNull final group_viewHolder group_viewHolder, int i, @NonNull modelclass modelclass) {
        String groupId = getRef(i).getKey();
        groupref.child(groupId).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                if(dataSnapshot.hasChild("profileimage")){
                    String profileimage = dataSnapshot.child("profileimage").getValue().toString();
                    String groupname = dataSnapshot.child("GroupprofileName").getValue().toString();
                    String groupStatus = dataSnapshot.child("StatusGroup").getValue().toString();

                    group_viewHolder.groupname.setText(groupname);
                    group_viewHolder.groupStatus.setText(groupStatus);
                    Picasso.get().load(profileimage).into(group_viewHolder.profileimage);
                }else{
                    String groupname = dataSnapshot.child("GroupprofileName").getValue().toString();
                    String groupStatus = dataSnapshot.child("StatusGroup").getValue().toString();

                    group_viewHolder.groupname.setText(groupname);
                    group_viewHolder.groupStatus.setText(groupStatus);
                    Picasso.get().load(R.mipmap.groupicon).into(group_viewHolder.profileimage);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

    @NonNull
    @Override
    public group_viewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.grouplayout,parent,false);
        group_viewHolder groupholder = new group_viewHolder(view);
        return groupholder;
    }
};

You can also use your model inside onDataChange like below:

@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

    modelclass modelClass = dataSnapshot.getValue(modelclass.class);

    if(!TextUtils.isEmpty(modelClass.getProfileimage())) {
        group_viewHolder.groupname.setText(modelClass.getGroupprofileName());
        group_viewHolder.groupStatus.setText(modelClass.getStatusGroup());
        Picasso.get().load(modelClass.getProfileimage()).into(group_viewHolder.profileimage);
    } else {
        group_viewHolder.groupname.setText(modelClass.getGroupprofileName());
        group_viewHolder.groupStatus.setText(modelClass.getStatusGroup());
        Picasso.get().load(R.mipmap.groupicon).into(group_viewHolder.profileimage);
    }
}

在选项对象中使用 groupref 代替 conref

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM