Как исправить com.google.firebase.DatabaseException: не удалось преобразовать значение типа java.util.HashMap в строку

#java #android

#java #Android

Вопрос:

Ошибка com.google.firebase.database.DatabaseException: Failed to convert value of type java.util.HashMap to String в том, что я хочу получить данные в представлении recycler, но это выдает ошибку. Я много пытался решить проблему, но не могу. Я привожу некоторый фрагмент кода

Модель Firebase:

Данные принадлежат моей базе данных firebase

      "user" : {
        "9gmWSVMhN4erdOeNCcXw7uB5Itq2" : {
          "email" : "look@gmail.com",
          "name" : "sagar",
          "password" : "asdfgh",
          "user_id" : "9gmWSVMhN4erdOeNCcXw7uB5Itq2"
        },

        "template" : {

          "FYKw520tCiPxrwi622xzdPzyGCi1" : {
            "-LbWzneRw0zTnE5naR2F" : {
              "c_address" : "aaa",
              "c_logo" : "https://www.freelogodesign.org/Content/img/logo-ex-7.png",
              "c_name" : "aaa",
              "p_designation" : "CTO",
              "p_email" : "yan@com",
              "p_name" : "name",
              "p_phone" : "012"
            },
            "-LbX2_P-KIaCEAkn9I3B" : {
              "c_address" : "bbb",
              "c_logo" : "https://www.freelogodesign.org/Content/img/logo-ex-7.png",
              "c_name" : "bbb",
              "p_designation" : "CEO",
              "p_email" : "gmail",
              "p_name" : "bbbb",
              "p_phone" : "098"
            }
     }
  

Итак, я хочу получить дочерние элементы в

Я попробовал этот код для извлечения данных

 
 DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference usersRef = rootRef.child("Accounts").child("Users");
    ValueEventListener eventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot ds : dataSnapshot.getChildren()) {
                String email = ds.child("email").getValue(String.class);
                String name = ds.child("name").getValue(String.class);
                Log.d("TAG", email   " / "   name);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    };
    usersRef.addListenerForSingleValueEvent(eventListener);


  

Это мой класс модели, с помощью которого я получил данные
Я думаю, что этот класс подходит для получения данных

Template.java

 
package com.example.look.np.models;

public class Template
{
  private String p_name;
  private String p_designation;
  private String p_email;
  private String p_phone;
  private String c_name;
  private String c_address;
  private String c_logo;
  private String tempID;

  //empty constructor
  public Template()
  {
  }
  //Constructor with variables
  public Template(String p_name, String p_designation, String p_email, String p_phone, String c_name, String c_address, String c_logo, String tempID)
  {
    this.p_name = p_name;
    this.p_designation = p_designation;
    this.p_email = p_email;
    this.p_phone = p_phone;
    this.c_name = c_name;
    this.c_address = c_address;
    this.c_logo = c_logo;
    this.tempID = tempID;
  }
  //Getter and Setter Methods 
  public String getP_name()
  {
    return p_name;
  }

  public void setP_name(String p_name)
  {
    this.p_name = p_name;
  }

  public String getP_designation()
  {
    return p_designation;
  }

  public void setP_designation(String p_designation)
  {
    this.p_designation = p_designation;
  }

  public String getP_email()
  {
    return p_email;
  }

  public void setP_email(String p_email)
  {
    this.p_email = p_email;
  }

  public String getP_phone()
  {
    return p_phone;
  }

  public void setP_phone(String p_phone)
  {
    this.p_phone = p_phone;
  }

  public String getC_name()
  {
    return c_name;
  }

  public void setC_name(String c_name)
  {
    this.c_name = c_name;
  }

  public String getC_address()
  {
    return c_address;
  }

  public void setC_address(String c_address)
  {
    this.c_address = c_address;
  }

  public String getC_logo()
  {
    return c_logo;
  }

  public void setC_logo(String c_logo)
  {
    this.c_logo = c_logo;
  }

  public String getTempID()
  {
    return tempID;
  }

  public void setTempID(String tempID)
  {
    this.tempID = tempID;
  }

}

  

This is my Fragment class where i want to show the data in the recycler view

MyCardFragment.class

 
public class MyCardFragment extends Fragment
{
  private static final String TAG = "MyCardFragment";

  RecyclerView templateRecycler;
  RecyclerviewAdapter adapter;

  List<Template> templateList;

  FirebaseDatabase firebaseDatabase;
  DatabaseReference databaseReference;
  DatabaseReference myref;
  FirebaseUser firebaseUser;
  FirebaseAuth auth;

  String key;

  //This is the empty constructor
  public MyCardFragment()
  {
    // Required empty public constructor
  }

  //This is the oncreate view where i wanna retrieve the data
  @Nullable
  @Override
  public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
  {

    View fragmentView = inflater.inflate(R.layout.fragment_mycards, container, false);

    templateRecycler = fragmentView.findViewById(R.id.recyclerView);
    templateRecycler.setLayoutManager(new LinearLayoutManager(getActivity()));

    auth = FirebaseAuth.getInstance();
    firebaseUser = auth.getCurrentUser();
    firebaseDatabase = FirebaseDatabase.getInstance();

    databaseReference = firebaseDatabase.getReference("user").child("template").child(firebaseUser.getUid());

    return fragmentView;
  }

  

В приведенном ниже методе onstart я хочу получить данные

 
  @Override
  public void onStart()
  {
    super.onStart();
    //Getting Template List From Database
    //The folloeing code block give me error
    databaseReference.addValueEventListener(new ValueEventListener()
    {
      @Override
      public void onDataChange(@NonNull DataSnapshot dataSnapshot)
      {
        templateList = new ArrayList<>();
        for (DataSnapshot templateSnap : dataSnapshot.getChildren())
        {

          Template template = templateSnap.getValue(Template.class);
          //--->This line gives me error i don 't know what happed here
          //  -- > This line should give what i want
         // -- > I can 't understand whether the model class is incorrect or database refrence
          Log.d(TAG, "onDataChange: "   template.toString());
          templateList.add(template);
        }
        adapter = new RecyclerviewAdapter(getActivity(), templateList);
        templateRecycler.setAdapter(adapter);
      }

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

      }
    });

  }
}

  

Примечание: С помощью этого кода данные извлекаются один раз, но я не знаю, что произойдет после этого, я получал ошибку

Пожалуйста, помогите мне, прошло два дня, я хочу исправить ошибку

Ответ №1:

1. В соответствии с вашим кодом для проверки ссылки на базу данных добавьте это утверждение

 Log.i("Uid",firebaseUser.getUid());
databaseReference = firebaseDatabase.getReference("user").child("template").child(firebaseUser.getUid());
  

После добавления этой строки проверьте журналы, возвращает ли Uid тот же ключ, что и в вашей базе данных, или нет.

2. Если ключ совпадает, то для проверки класса модели попробуйте распечатать журналы

 Log.i("template Snap key",templateSnap.child("c_address").getValue(String.class));
Template template = templateSnap.getValue(Template.class);
Log.i("template name",template.c_address);
  

После этих двух журналов вы узнаете, где именно возникает проблема, и добавьте эти журналы сюда, чтобы я мог понять, где именно возникает проблема.
Кстати, класс модели, похоже, в порядке.

3. Что является родителем пользователя?

4. Во-вторых, создайте объект List<> вне метода onDataChange .

Комментарии:

1. Привет, Информация: я использую навигационный ящик, где у меня есть элемент навигационного ящика с именем Mycard, который ссылается на MyCardFragment. Когда я нажимаю Mycard, он выдает ошибку, о которой я упоминаю вверху

2. после Log.d(ТЕГ, «onDataChange: » templateSnap.toString()); 2019-04-16 22:32:31.139 28389-28389/ com.example.look.np D/MyCardFragment: onDataChange: DataSnapshot { ключ = -LcaVMeriUCrfsg-rQOa, значение = {tempID=-LcaVMeriUCrfsg-rQOa, p_email=yan@com, c_name=aaa, p_phone= 012, p_name=name, c_address=aaa, c_logo=freelogodesign.org/Content/img/logo-ex-7.png , p_designation=ТЕХНИЧЕСКИЙ директор} }

3. Прикрепленные вами данные не имеют поля tempID, но вы получаете tempID в журналах, как это возможно, и в templatesnap есть два дочерних элемента, но журнал выдает только один дочерний элемент. Исправьте свои журналы или данные в базе данных.

Ответ №2:

Забавно, но это была ошибка IDE.

Я только что обновил IDE до последней версии, и это решило мою проблему.