#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 до последней версии, и это решило мою проблему.