Android中Firebase实时数据库child()传空值错误问题求助
Firebase实时数据库获取
postid失败,isLiked()函数报错:Can't pass null for argument 'pathString' in child() 问题描述
我在开发Android应用时,尝试从Firebase实时数据库获取postid始终失败,且isLiked()函数持续抛出错误:
Can't pass null for argument 'pathString' in child()
已在调用isLiked()前添加postid非空判断,但问题依旧存在。
我的代码
package com.example.lively.Adapter; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.fragment.app.FragmentActivity; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import com.example.lively.CommentActivity; import com.example.lively.Model.Post; import com.example.lively.Model.User; import com.example.lively.PostDetailFragment; import com.example.lively.ProfileFragment; import com.example.lively.R; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseError; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.ValueEventListener; import java.util.List; public class PostAdapter extends RecyclerView.Adapter<PostAdapter.ViewHolder> { public Context mContext; public List<Post> mPost; private FirebaseUser firebaseUser; public PostAdapter(Context mContext, List<Post> mPost) { this.mContext = mContext; this.mPost = mPost; } @NonNull @Override public PostAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(R.layout.post_items, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull PostAdapter.ViewHolder holder, int position) { firebaseUser = FirebaseAuth.getInstance().getCurrentUser(); Post post = mPost.get(position); Glide.with(mContext).load(post.getPostImage()).into(holder.postImage); if (post.getDescription().equals("")) { holder.description.setVisibility(View.GONE); } else { holder.description.setVisibility(View.VISIBLE); holder.description.setText(post.getDescription()); } publisherInfo(holder.profileImage, holder.username, holder.publisher, post.getPublisher()); if(post.getPostId()!=null) isLiked(post.getPostId(), holder.like); nrLikes(holder.likes, post.getPostId()); getComments(post.getPostId(), holder.comments); isSaved(post.getPostId(), holder.save); holder.profileImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SharedPreferences.Editor editor = mContext.getSharedPreferences("PEEFS", Context.MODE_PRIVATE).edit(); editor.putString("profileid", post.getPublisher()); ((FragmentActivity)mContext).getSupportFragmentManager().beginTransaction().replace(R.id.frameLayout, new ProfileFragment()).commit(); } }); holder.username.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SharedPreferences.Editor editor = mContext.getSharedPreferences("PEEFS", Context.MODE_PRIVATE).edit(); editor.putString("profileid", post.getPublisher()); ((FragmentActivity)mContext).getSupportFragmentManager().beginTransaction().replace(R.id.frameLayout, new ProfileFragment()).commit(); } }); holder.publisher.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SharedPreferences.Editor editor = mContext.getSharedPreferences("PEEFS", Context.MODE_PRIVATE).edit(); editor.putString("profileid", post.getPublisher()); ((FragmentActivity)mContext).getSupportFragmentManager().beginTransaction().replace(R.id.frameLayout, new ProfileFragment()).commit(); } }); holder.postImage.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SharedPreferences.Editor editor = mContext.getSharedPreferences("PEEFS", Context.MODE_PRIVATE).edit(); editor.putString("postid", post.getPostId()); ((FragmentActivity)mContext).getSupportFragmentManager().beginTransaction().replace(R.id.frameLayout, new PostDetailFragment()).commit(); } }); holder.save.setOnClickListener(v -> { if (holder.like.getTag().equals("save")) { FirebaseDatabase.getInstance().getReference().child("Saves").child(firebaseUser.getUid()) .child(post.getPostId()).setValue(true); } else { FirebaseDatabase.getInstance().getReference().child("Saves").child(firebaseUser.getUid()) .child(post.getPostId()).removeValue(); } }); holder.like.setOnClickListener(v -> { if (holder.like.getTag().equals("like")) { FirebaseDatabase.getInstance().getReference().child("Likes").child(post.getPostId()) .child(firebaseUser.getUid()).setValue(true); } else { FirebaseDatabase.getInstance().getReference().child("Likes").child(post.getPostId()) .child(firebaseUser.getUid()).removeValue(); } }); holder.comment.setOnClickListener(v -> { Intent intent = new Intent(mContext, CommentActivity.class); intent.putExtra("postid", post.getPostId()); intent.putExtra("publisherid", post.getPublisher()); mContext.startActivity(intent); }); holder.comments.setOnClickListener(v -> { Intent intent = new Intent(mContext, CommentActivity.class); intent.putExtra("postid", post.getPostId()); intent.putExtra("publisherid", post.getPublisher()); mContext.startActivity(intent); }); } @Override public int getItemCount() { return mPost.size(); } public static class ViewHolder extends RecyclerView.ViewHolder { public ImageView profileImage, postImage, like, comment, save; public TextView username, likes, publisher, description, comments; public ViewHolder(@NonNull View itemView) { super(itemView); profileImage = itemView.findViewById(R.id.imageProfile); postImage = itemView.findViewById(R.id.postImage); like = itemView.findViewById(R.id.like); comment = itemView.findViewById(R.id.comment); save = itemView.findViewById(R.id.save); username = itemView.findViewById(R.id.username); likes = itemView.findViewById(R.id.likes); publisher = itemView.findViewById(R.id.publisher); description = itemView.findViewById(R.id.description); comments = itemView.findViewById(R.id.comments); } } private void getComments(String postid, TextView comments) { DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Comments").child(postid); reference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { comments.setText("View all " + snapshot.getChildrenCount() + " comments"); } @Override public void onCancelled(@NonNull DatabaseError error) { } }); } private void isLiked(String postid, final ImageView imageView) { final FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser(); if (firebaseUser != null ) { DatabaseReference reference = FirebaseDatabase.getInstance().getReference() .child("Likes") .child(postid); reference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (snapshot.child(firebaseUser.getUid()).exists()) { imageView.setImageResource(R.drawable.baseline_thumb_up_alt_24); imageView.setTag("liked"); } else { imageView.setImageResource(R.drawable.baseline_thumb_up_off_alt_24); imageView.setTag("like"); } } @Override public void onCancelled(@NonNull DatabaseError error) { } }); } } private void nrLikes(final TextView likes, String postid) { DatabaseReference reference1 = FirebaseDatabase.getInstance().getReference().child("Likes") .child(postid); reference1.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { likes.setText(snapshot.getChildrenCount() + "likes"); } @Override public void onCancelled(@NonNull DatabaseError error) { } }); } private void publisherInfo(ImageView imageProfile, TextView username, TextView publisher, String userid) { DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users").child(userid); reference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { User user = snapshot.getValue(User.class); Glide.with(mContext).load(user.getImageurl()).into(imageProfile); username.setText(user.getUsername()); publisher.setText(user.getUsername()); } @Override public void onCancelled(@NonNull DatabaseError error) { } }); } private void isSaved(final String postid, ImageView imageView) { FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser(); DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Saves") .child(firebaseUser.getUid()); reference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (snapshot.child(postid).exists()) { imageView.setImageResource(R.drawable.baseline_bookmark_24); imageView.setTag("saved"); } else { imageView.setImageResource(R.drawable.round_bookmark_border_24); imageView.setTag("save"); } } @Override public void onCancelled(@NonNull DatabaseError error) { } }); } }
实时数据库结构
数据库根节点包含Posts、Users、Likes、Comments、Saves节点:
Posts节点下的每个子节点为帖子的唯一ID,内部包含description、postid、postImage、publisher字段Users节点存储用户基础信息Likes、Comments、Saves节点以帖子ID为二级节点,存储对应互动数据
问题排查与修复步骤
修正Post对象的postid赋值逻辑
从Firebase读取帖子数据时,需将节点的key(即帖子唯一ID)赋值给Post对象的postid属性,否则getPostId()会返回null:// 示例:读取Post数据时的正确赋值 DatabaseReference postsRef = FirebaseDatabase.getInstance().getReference("Posts"); postsRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { List<Post> postList = new ArrayList<>(); for(DataSnapshot postSnap : snapshot.getChildren()){ Post post = postSnap.getValue(Post.class); post.setPostId(postSnap.getKey()); // 关键:将节点key设为postid postList.add(post); } // 更新RecyclerView适配器 } @Override public void onCancelled(@NonNull DatabaseError error) {} });统一所有postid调用的空值判断
仅给isLiked()加判断不够,所有使用post.getPostId()的地方都要做非空校验,避免传入null:// 在onBindViewHolder中统一处理 String postId = post.getPostId(); if(postId != null && !postId.isEmpty()){ isLiked(postId, holder.like); nrLikes(holder.likes, postId); getComments(postId, holder.comments); isSaved(postId, holder.save); // 点击事件中的postid也使用这个变量 holder.postImage.setOnClickListener(v -> { SharedPreferences.Editor editor = mContext.getSharedPreferences("PEEFS", Context.MODE_PRIVATE).edit(); editor.putString("postid", postId); ((FragmentActivity)mContext).getSupportFragmentManager().beginTransaction().replace(R.id.frameLayout, new PostDetailFragment()).commit(); }); } else { // 处理postid为空的情况,比如隐藏互动按钮 holder.like.setVisibility(View.GONE); holder.comment.setVisibility(View.GONE); holder.save.setVisibility(View.GONE); }修复isSaved()函数的潜在空指针
isSaved()中直接调用firebaseUser.getUid()前,需先判断用户是否已登录:private void isSaved(final String postid, ImageView imageView) { FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser(); if(firebaseUser == null) return; DatabaseReference reference = FirebaseDatabase.getInstance().getReference() .child("Saves") .child(firebaseUser.getUid()); reference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (snapshot.child(postid).exists()) { imageView.setImageResource(R.drawable.baseline_bookmark_24); imageView.setTag("saved"); } else { imageView.setImageResource(R.drawable.round_bookmark_border_24); imageView.setTag("save"); } } @Override public void onCancelled(@NonNull DatabaseError error) {} }); }验证数据库中的postid字段
确认Firebase实时数据库中,每个帖子节点下的postid字段不为空,且与节点key一致。若数据库中postid本身为空,读取后自然会返回null。
内容的提问来源于stack exchange,提问作者ritu
相关产品推荐
相关产品推荐

