получаване на грешка com.google.firebase.database.DatabaseException: Неуспешно конвертиране на стойност от тип java.util.HashMap в String

Опитвам се да извлека запазени от потребителите данни и да ги покажа в страницата на техния профил, използвайки изглед на рециклиращо устройство. Когато стартирам приложението си, за да видя дали всичко работи добре, но приложението ми продължава да се срива и спира да работи. Грешката, която получавам е com.google.firebase.database.DatabaseException: Failed to convert value of type java.util.HashMap to String. Това ми се е случвало и преди, но не съм сигурен какъв е проблемът сега. Може ли някой да ми помогне да реша този проблем. Благодаря предварително. Актуализирана база данни

Адаптер за изображения

public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ImageViewHolder>{

    private Context mContext;
    private ArrayList<UserInformation> users;

    public ImageAdapter(Context context, ArrayList<UserInformation> uploads){
        mContext = context;
        users = uploads;

    }

    @NonNull
    @Override
    public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View V = LayoutInflater.from(mContext).inflate(R.layout.cardview, parent, false);
        return new ImageViewHolder(V);


    }

    @Override
    public void onBindViewHolder(@NonNull ImageViewHolder holder, int position) {
        //String uploadCurrent=users.get(position).getmImageUrl();

        holder.txt1.setText(users.get(position).getAction());
        Picasso.get().load(users.get(position).getmImageUrl()).fit().centerCrop().into(holder.imageView);

    }

    @Override
    public int getItemCount() {
        return users.size();

    }

    public class ImageViewHolder extends RecyclerView.ViewHolder{
        public ImageView imageView;
        public TextView txt1;

        public ImageViewHolder(@NonNull View itemView) {
            super(itemView);

            imageView=itemView.findViewById(R.id.imageview);
            //txt1=itemView.findViewById(R.id.action);
        }
    }
}

Модел клас

  public UserInformation(String  mImageUrl,  String cate, String action, String headline, String websiteurl) {

        this.mImageUrl =  mImageUrl;
        this.cate = cate;
        this.action = action;
        this.headline = headline;
        this.websiteurl = websiteurl;

    }

    public UserInformation() {

    }

    public String getmImageUrl() {
        return mImageUrl;
    }

    public void setmImageUrl(String mImageUrl) {
        this.mImageUrl = mImageUrl;
    }


    public String getCategory() {
        return cate;
    }

    public void setCategory(String category) {
        this.cate = cate;
    }

    public String getAction() {
        return action;
    }

    public void setAction(String action) {
        this.action = action;
    }

    public String getHeadline() {
        return headline;
    }

    public void setHeadline(String header) {
        this.headline = headline;
    }

    public String getWebsiteurl() {
        return websiteurl;
    }

    public void setWebsiteurl(String websiteurl) {
        this.websiteurl = websiteurl;
    }
}

Основен клас

recyclerView = findViewById(R.id.recyclerView);
RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getApplicationContext(),3);

recyclerView.setLayoutManager(layoutManager);
myUploads = new ArrayList<UserInformation>();
aAdapter = new ImageAdapter(ProfileActivity.this, myUploads);
recyclerView.setAdapter(aAdapter);
aAdapter.notifyDataSetChanged();

h=new Handler();

databaseReference = FirebaseDatabase.getInstance().getReference("Users");
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();

firebaseStorage = FirebaseStorage.getInstance();
storageReference = firebaseStorage.getReference();

firebaseUser = firebaseAuth.getInstance().getCurrentUser();
t=findViewById(R.id.none);

    databaseReference.child(uid).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            for (DataSnapshot postsnapshot : dataSnapshot.getChildren()) {

                UserInformation upload=postsnapshot.getValue(UserInformation.class);


                myUploads.add(upload);
                 aAdapter = new ImageAdapter(ProfileActivity.this, myUploads);
                 recyclerView.setAdapter(aAdapter);

            }

person steph    schedule 29.04.2020    source източник
comment
Добавете екранната снимка на базата данни към вашия въпрос, а не като връзка.   -  person Hasan Bou Taam    schedule 30.04.2020


Отговори (1)


Доколкото виждам вашият код за четене се свежда до:

databaseReference = FirebaseDatabase.getInstance().getReference("Users");
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();

databaseReference.child(uid).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        for (DataSnapshot postsnapshot : dataSnapshot.getChildren()) {

            UserInformation upload=postsnapshot.getValue(UserInformation.class);


            myUploads.add(upload);
             aAdapter = new ImageAdapter(ProfileActivity.this, myUploads);
             recyclerView.setAdapter(aAdapter);

        }

Това означава, че прикачвате слушател към /Users/$uid в базата данни и че вашият onDataChange ще бъде извикан с моментна снимка на данни за един потребител.

В този случай не е необходимо да преминавате през snapshot.getChildren() в onDataChange, тъй като вече сте насочили слушателя да чете единична моментна снимка по точен път. Така:

databaseReference = FirebaseDatabase.getInstance().getReference("Users");
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();

databaseReference.child(uid).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        UserInformation upload = dataSnapshot.getValue(UserInformation.class);

        myUploads.add(upload);
        aAdapter = new ImageAdapter(ProfileActivity.this, myUploads);
        recyclerView.setAdapter(aAdapter);
    }

person Frank van Puffelen    schedule 29.04.2020
comment
van Puffen благодаря за отговора. Следвах това, което ми казахте да направя, но сега нищо подобно на изображението, което беше запазено, не се показва, това е просто изглед на карта без нищо - person steph; 30.04.2020
comment
Което е по-добре от срив, така че бих обмислил този процес. :) Ако искате да видите дали промяната на кода работи, поставете точка на прекъсване на ред UserInformation upload = dataSnapshot.getValue(UserInformation.class) между вашия оригинален код и актуализацията. Ако upload има стойности след този ред в актуализацията, той може да прочете стойностите от базата данни и следващият проблем е по-надолу по веригата. - person Frank van Puffelen; 30.04.2020
comment
Начинът, по който съхранявате mImageUrl в базата данни, ви затруднява да го прочетете обратно. Това е малко отделен проблем, така че препоръчвам или да потърсите тук или отваряне на нов въпрос конкретно за това. Като цяло трябва да работите, за да изолирате проблема си до такава степен, че моят отговор да е или правилен, или грешен, а не частично правилен, както изглежда случаят тук. - person Frank van Puffelen; 30.04.2020
comment
Съжалявам за закъснението. Все още имам проблеми с това. Изображенията не се показват, просто получавам празен изглед на картата. Дори поправих начина, по който съхранявам частта mImageUrl, можете да погледнете актуализираната база данни по-горе. Не съм сигурен какъв е проблемът? - person steph; 06.05.2020