尝试输入onDataChange Firebase Android时应用崩溃 [英] App crashes when trying to enter onDataChange Firebase Android

查看:47
本文介绍了尝试输入onDataChange Firebase Android时应用崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想向我展示cardview中firebase databse中的所有用户,这些用户在recyclerview中,但是在调试器中,UserActivity的第60行显示了一个错误. 我在数据库中放了一个屏幕截图:

I want to show me all the users from firebase databse in a cardview who is in a recyclerview but in debugger shows me an error at line 60 in UserActivity. I put a screenshot with my database:

UsersFragment:

The UsersFragment:

public class UsersFragment extends Fragment {
    private RecyclerView recyclerView;
    private UserAdapter userAdapter;
    private List<User> mUsers;


    @Override
    public View onCreateView (LayoutInflater inflater, ViewGroup container,
                              Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view= inflater.inflate ( R.layout.fragment_users3, container, false );
recyclerView=view.findViewById (R.id.recycler_view  );

recyclerView.setLayoutManager ( new LinearLayoutManager ( getContext () ) );
mUsers=new ArrayList<> (  );
readUsers();

        return view;
    }

    private void readUsers () {
        final FirebaseUser firebaseUser= FirebaseAuth.getInstance ().getCurrentUser ();
        DatabaseReference referenc= FirebaseDatabase.getInstance ().getReference ("users");

        referenc.addValueEventListener ( new ValueEventListener () {
            @Override
            public void onDataChange (@NonNull DataSnapshot dataSnapshot) {
                mUsers.clear ();
                for(DataSnapshot snapshot:dataSnapshot.getChildren ()){
                    User user=snapshot.getValue (User.class);
                    assert user!=null;
                    assert firebaseUser!=null;
                    if(!firebaseUser.getUid ().equals ( user.getUid () )){
                        mUsers.add ( user );

                    }
                }
                userAdapter=new UserAdapter ( getContext (),mUsers );
                recyclerView.setAdapter ( userAdapter );
            }

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

            }
        } );
    }


}

UserAdapter.在我中使用了User类:

The UserAdapter.In i used the User class:

public class UserAdapter extends RecyclerView.Adapter<UserAdapter.ViewHolder> {
    private Context mContext;
    private List<User> mUsers;
    public UserAdapter(Context mContext,List<User> mUsers){
        this.mUsers=mUsers;
        this.mContext=mContext;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder (@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from ( mContext ).inflate ( R.layout.users_template ,parent,false);

        return new UserAdapter.ViewHolder ( view );
    }

    @Override
    public void onBindViewHolder (@NonNull ViewHolder holder, int position) {
User user=mUsers.get ( position );
holder.username.setText ( user.getFirstName () );

    }

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

    public class ViewHolder extends RecyclerView.ViewHolder{

        public TextView username;

        public ViewHolder(View itemView){
            super(itemView);
            username=itemView.findViewById ( R.id.username1 );
        }

    }
}

存储名字的用户:

public class User {
   public String firstName;
    public String secondName;
    public String uid;
    public String email;
    public User(){

    }



    public User (String firstName, String secondName, String uid, String email) {
        this.firstName = firstName;
        this.secondName = secondName;
        this.uid=uid;
        this.email=email;
    }

    public User (String firstname, String secondname) {
    }
@PropertyName ( "FirsName" )
    public String getFirstName () {
        return firstName;
    }
    @PropertyName ("SecondName" )
    public String getSecondName () {
        return secondName;
    }
    @PropertyName ( "Uid" )
    public String getUid () {
        return uid;
    }
    @PropertyName ( "E-mail" )
    public String getEmail () {
        return email;
    }
    @PropertyName ( "FirsName" )
    public void setFirstName (String firstName) {
        this.firstName = firstName;
    }
    @PropertyName ( "SecondName" )
    public void setSecondName (String secondName) {
        this.secondName = secondName;
    }
    @PropertyName ( "Uid" )
    public void setUid (String uid) {
        this.uid = uid;
    }
    @PropertyName ( "E-mail" )
    public void setEmail (String email) {
        this.email = email;
    }
}

我的数据库规则是:

{
  "rules": {
    ".read": "true",
      ".write":"true",
    "users":{
    "$user_id":{
       ".read": "auth.uid === $user_id",
       ".write": "auth.uid === $user_id"

    }
  }
}
}

在调试模式下,向我显示了此信息:

In the debug mode it shows me this:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.sportsbuddy, PID: 662
    com.google.firebase.database.DatabaseException: Found two getters or fields with conflicting case sensitivity for property: secondname
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.addProperty(com.google.firebase:firebase-database@@17.0.0:540)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.<init>(com.google.firebase:firebase-database@@17.0.0:471)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.loadOrCreateBeanMapperForClass(com.google.firebase:firebase-database@@17.0.0:312)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(com.google.firebase:firebase-database@@17.0.0:413)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(com.google.firebase:firebase-database@@17.0.0:214)
        at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(com.google.firebase:firebase-database@@17.0.0:79)
        at com.google.firebase.database.DataSnapshot.getValue(com.google.firebase:firebase-database@@17.0.0:212)
        at com.example.sportsbuddy.Fragments.UsersFragment$1.onDataChange(UsersFragment.java:60)
        at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@17.0.0:75)
        at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@17.0.0:63)
        at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@17.0.0:55)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:6986)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)

主要错误是在UsersFragment中的onDataChange.

The main error is at onDataChange in UsersFragment.

我希望向我展示我在数据库中拥有的所有用户.

I expect to show me all the users that I have in the database.

推荐答案

您的错误提示:

Found two getters or fields with conflicting case sensitivity for property: secondname

要了解此错误的含义,您需要了解Firebase如何序列化&反序列化从数据库接收的数据.

For understanding what this error means, you need to understand how Firebase serializes & deserializes the data that you receive from your database.

Firebase使用字段名称以及getter和setter来序列化和反序列化对象,这意味着,每当您从数据库中接收JSON对象时,firebase都会将这些键值与getter/setter以及您字段中的字段进行映射POJO类.

Firebase uses field names, as well as getters and setters to serialize and deserialize object, which means, whenever you receive JSON object from your database, firebase will map these key values with your getters/setters as well as the fields in your POJO class.

要消除此错误,您必须更改字段名称,即

To remove this error, you'll have to either change your field names, i.e.

public String secondName;

与数据库中的其他内容 OR 不同,您需要更改getter&设置器功能名称.由于Firebase两次看到该属性,因此出现错误,一次在您的字段中,第二次在您的getter/setter中.

to something different than that you have in your database, OR , you need to change the getter & setter function names. Error is given as firebase is seeing the property twice, once in your fields, and second time in your getter/setter.

此外,请尝试将变量设为私有.这可能会有所帮助.另外,如何将数据库中的电子邮件"更改为简单的电子邮件"?

Also, try making your variables private. It might help. Also, how about changing "E-mail" in your database to simply "email"?

这篇关于尝试输入onDataChange Firebase Android时应用崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆