【问题标题】:App crashes when trying to enter onDataChange Firebase Android尝试输入 onDataChange Firebase Android 时应用程序崩溃
【发布时间】:2019-06-29 09:50:40
【问题描述】:

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

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.In 我使用了 User 类:

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"

    }
  }
}
}

在调试模式下,它向我展示了这个:

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。

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

【问题讨论】:

  • 你必须发布你得到的完整错误,而不仅仅是一行错误。
  • 我现在修改了。对不起我的错误。

标签: android firebase firebase-realtime-database


【解决方案1】:

你的错误说:

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

要了解此错误的含义,您需要了解 Firebase 如何对您从数据库接收的数据进行序列化和反序列化。

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

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

public String secondName;

对于不同于您在数据库中的内容,OR,您需要更改 getter 和 setter 函数名称。错误是因为 firebase 两次看到该属性,一次在您的字段中,第二次在您的 getter/setter 中。

另外,请尝试将您的变量设为私有。它可能会有所帮助。另外,如何将数据库中的“电子邮件”更改为简单的“电子邮件”?

【讨论】:

  • 我更改了数据库中的字段,但仍然显示 onDataChange 有错误。
  • 您遇到什么错误?这次会是一个不同的错误,可能与“电子邮件”有关。可能是 NullPointerException
  • com.google.firebase.database.DatabaseException:发现两个 getter 或属性的区分大小写冲突的字段:secondname
  • 这个错误仍然出现,我修改了数据库中的文本
  • 检查您的字段是否区分大小写。
【解决方案2】:

改变你的构造函数

    public User (String firstname, String secondname) {
    }

    public User (String firstName, String secondName) {
    }

另外,您的 firebase 密钥与您的模型类密钥不匹配。

您的 FirebaseKey 是 FirstName,您的模型类密钥是 firstName。修复此问题(SecondNamesecondName 相同)!

【讨论】:

  • @SagarBalyan 仍然是错误的,因为该错误完全不同
【解决方案3】:

如果不知道确切的错误,就很难说。

但我认为是当您将 firebase 对象转换为用户类时。在您的 Firebase 中,字段电子邮件是“电子邮件”,而在您的课程中是“电子邮件”。更改它以匹配您的 firebase 数据库或相反(更改 firebase 字段以匹配您的用户类)。

发布您的完整错误,以便我们能够提供更多信息。

---编辑---

Firebase 数据库和您的用户类之间区分大小写。更改字段以相互匹配,你会没事的。

【讨论】:

  • 在调试器模式下,它在 onDataChange 的 UsersFragment 处显示一个错误
【解决方案4】:

您的字段和 getter/setter 都是公开的。这意味着 Firebase 可以看到两个属性:

secondname for the field
SecondName for the getter/setter

由于现在还不清楚如何将 Java 类映射到数据库中的 JSON,所以它会抛出这个错误:

找到两个属性区分大小写冲突的 getter 或字段

最简单的解决方法是将您的字段设为私有:

public class User {
    private String firstName;
    private String secondName;
    private String uid;
    private String email;

    public User(){
    }
    ...

【讨论】:

猜你喜欢
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
相关资源
最近更新 更多