【问题标题】:NullPointerException while trying to receive data from Firebase Realtime Database尝试从 Firebase 实时数据库接收数据时出现 NullPointerException
【发布时间】:2020-04-18 23:12:11
【问题描述】:

数据库结构

我正在尝试从聊天列表中获取对用户的引用。我想要做的是,如果用户登录,他将看到下面提到的用户是他的回收站视图内 Chatlist 节点中的 Uid。

我在下一行得到了一个空指针异常

   DatabaseReference UserRef = rootRef.child("Users").child(chatlist.getId());

例外

 java.lang.NullPointerException: Can't pass null for argument 'pathString' in child()
    at com.google.firebase.database.DatabaseReference.child(com.google.firebase:firebase-database@@19.2.1:96)
    at com.shivam.chatapp2.Fragments.Chats.onCreateView(Chats.java:112)

我的代码

public class Chats extends Fragment {

private RecyclerView recyclerView;

private UserAdapter userAdapter;
private List<User> mUsers;

FirebaseUser fuser;
DatabaseReference reference;



FloatingActionButton profile, credentials;

ValueEventListener ChatListListener;
List<Chatlist> usersList;

private ChatsFragmentAdapter chatsFragmentAdapter;


public Chats() {
    // Required empty public constructor
}


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

    profile = view.findViewById(R.id.fab_edit_profile_pic);
    credentials = view.findViewById(R.id.fab_edit_name);
    FabAction();

    recyclerView = view.findViewById(R.id.recycler_view);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));



    fuser = FirebaseAuth.getInstance().getCurrentUser();

    usersList = new ArrayList<>();

    reference = FirebaseDatabase.getInstance().getReference("Chatlist").child(fuser.getUid());
    reference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            usersList.clear();
            if(dataSnapshot.exists()) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    Chatlist chatlist = snapshot.getValue(Chatlist.class);
                    usersList.add(chatlist);
                }
            }

            //chatList();
        }

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

        }
    });


    Chatlist chatlist=new Chatlist();

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference UserRef = rootRef.child("Users").child(chatlist.getId());
    UserRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

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

                User user = snapshot.getValue(User.class);

                mUsers.add(user);

            }

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

        }

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

        }
    });



    return view;
}

更新

Chatlist.java

    public class Chatlist {
    public String id;
    public String MessageCheck;

    public Chatlist() {
    }

    public Chatlist(String id) {
        this.id = id;

    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }


}

用户.java

    public class User {

    private String id;
    private String First;
    private String EmailID;
    private String imageURL;
    private String status;

    public User(String id, String first, String emailID, String imageURL,String status) {
        this.id = id;
        this.First = first;
        this.EmailID = emailID;
        this.imageURL = imageURL;
        this.status=status;


    }

    public User() {
    }

    public User(String userid, String first_name, String eMail) {

    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getFirst() {
        return First;
    }

    public void setFirst(String first) {
        First = first;
    }

    public String getImageURL() {
        return imageURL;
    }

    public void setImageURL(String imageURL) {
        this.imageURL = imageURL;
    }

    public String getEmailID() {
        return EmailID;
    }

    public void setEmailID(String emailID) {
        EmailID = emailID;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

}

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    从您对chatlist 节点的第一个查询开始收听users 节点:

    reference = FirebaseDatabase.getInstance().getReference("Chatlist").child(fuser.getUid());
    
    reference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    usersList.clear();
    if(dataSnapshot.exists()) {
    for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
    Chatlist chatlist = snapshot.getValue(Chatlist.class);
    usersList.add(chatlist);
    
    //start listening to users node here
    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference UserRef = rootRef.child("Users").child(chatlist.getId());
    UserRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    .....
    ....
    ....
    }
    ....
    ....
    

    更新

    确保删除此行:

    Chatlist chatlist=new Chatlist();
    

    更新 2

    不要在用户查询中这样做:

    for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
    
    User user = snapshot.getValue(User.class);
    
    mUsers.add(user);
    
    }
    

    改为这样做:

    User user = dataSnapshot.getValue(User.class);
    mUsers.add(user);
    

    更新 3

    聊天列表类:

    public class Chatlist {
    public String id;
    
    
    public Chatlist(String id) {
    this.id = id;
    }
    
    public Chatlist(String id) {
        this.id = id;
    
    }
    
    public String getId() {
        return id;
    }
    
    public void setId(String id) {
        this.id = id;
    }
    
    
    }
    

    用户类:

    public class User {
    
    private String id;
    private String First;
    private String EmailId;
    private String imageURL;
    private String status;
    
    public User(String id, String First, String EmailId, String imageURL,String status) {
        this.id = id;
        this.First = First;
        this.EmailId = EmailId;
        this.imageURL = imageURL;
        this.status=status;
    
    
    }
    
    public User() {
    }
    
    public User(String userid, String first_name, String eMail) {
    
    }
    
    public String getId() {
        return id;
    }
    
    public void setId(String id) {
        this.id = id;
    }
    
    public String getFirst() {
        return First;
    }
    
    public void setFirst(String first) {
        this.First = first;
    }
    
    public String getImageURL() {
        return imageURL;
    }
    
    public void setImageURL(String imageURL) {
        this.imageURL = imageURL;
    }
    
    public String getEmailID() {
        return EmailId;
    }
    
    public void setEmailID(String emailID) {
        this.EmailId = emailID;
    }
    
    public String getStatus() {
        return status;
    }
    
    public void setStatus(String status) {
        this.status = status;
    }
    

    }

    【讨论】:

    • 您必须在聊天列表查询的 onDataChange() 方法中添加UserRef.addListenerFor......
    • 好吧,看看重新制作这些类,并确保变量的名称与数据库中的键名完全相同(大写和小写字母在两个类和数据库)。
    • 您是否使对象变量与您的数据库同名?
    • 使用我在第三次更新中为您编写的课程。
    • 啊,请确保将类命名为用户而不是用户。
    猜你喜欢
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多