You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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为二级节点,存储对应互动数据

问题排查与修复步骤

  1. 修正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) {}
    });
    
  2. 统一所有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);
    }
    
  3. 修复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) {}
        });
    }
    
  4. 验证数据库中的postid字段
    确认Firebase实时数据库中,每个帖子节点下的postid字段不为空,且与节点key一致。若数据库中postid本身为空,读取后自然会返回null。

内容的提问来源于stack exchange,提问作者ritu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:09:49