【问题标题】:Firebase Database content deletionFirebase 数据库内容删除
【发布时间】:2026-02-20 11:30:01
【问题描述】:

在我的项目中,Firebase 中有两个数据库。一个是通用数据库,名为BlogPosts,用于所有帖子,一个名为UserPosts,用于在特定用户下过滤的帖子。从BlogPosts 我可以获得必要的数据,以便我可以转到UserPosts 中的特定帖子(我已经在我在这里添加的文档中完成了)。我想创建一个系统,以便从主页(检索到BlogPosts)删除一些帖子时,它将从Firebase数据库中删除BlogPostsUserPosts中的数据。但是每次我运行我的应用程序并尝试删除一些帖子时,系统都会崩溃。

这是我的具体代码:

databaseReference.addValueEventListener(new ValueEventListener() {
           @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                  if(dataSnapshot.exists())
                 {
                       //get the profile id from BlogPosts post so that we can reach the same post in Userposts
                        String profileid = dataSnapshot.child("ProfileId").getValue().toString();

                      profiledb = FirebaseDatabase.getInstance()
                                                .getReference().child("UserPosts").child(id).child(profileid);

                                                        }
                                                    }

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

                  }
         })   ;


             profiledb.removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
                              @Override
                              public void onSuccess(Void aVoid) {

                              databaseReference.removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
                               @Override
                                public void onSuccess(Void aVoid) {


                               ProfileFragment prf = new ProfileFragment();

                              android.support.v4.app.FragmentTransaction fragmentTransaction =getFragmentManager().beginTransaction();

                              fragmentTransaction.replace(R.id.fragment_container, prf).commit();


                                                            }
                                                        });


                                                    }
                                                });

错误如下:

java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.tasks.Task com.google.firebase.database.DatabaseReference.removeValue()' on a null object reference
                      at com.example.zub.projectFirebase.SinglePostFragment$2$4$1.onMenuItemClick(SinglePostFragment.java:327)

【问题讨论】:

  • databaseReference 是对 BlogPosts 数据库中文章的引用。
  • 您必须为所有交易提供不同的数据库参考
  • 请解释一下。
  • 查看我提供的答案。将用于删除profiledb 的代码放入您获得其数据库引用的位置。这样,它将在删除之前首先获得引用。你错的地方是以不同的方式运行代码。在第一个事务太重而无法加载的情况下,它将继续处理其他事务,并使 db ref 为空,因为它在尝试另一个事务之前没有完成
  • 您在哪一行代码出现此错误?请回复@。

标签: android firebase firebase-realtime-database nullpointerexception


【解决方案1】:

您的错误在于以不同的方式运行代码。在第一个事务太重而无法加载的情况下,它将继续执行其他事务,并使db ref 成为null,因为它在尝试另一个事务之前没有完成 因此,将删除 profiledb 的代码放入您获得其数据库引用的位置。这样,它将在删除之前首先获得引用。

 databaseReference.addValueEventListener(new ValueEventListener() {
           @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                  if(dataSnapshot.exists())
                 {
                       //get the profile id from BlogPosts post so that we can reach the same post in Userposts
                        String profileid = dataSnapshot.child("ProfileId").getValue().toString();

                      profiledb = FirebaseDatabase.getInstance()
                                                .getReference().child("UserPosts").child(id).child(profileid);

         profiledb.removeValue().addOnSuccessListener(new 
         OnSuccessListener<Void>() {
                          @Override
                          public void onSuccess(Void aVoid) {

                          databaseReference.removeValue().addOnSuccessListener(new OnSuccessListener<Void>() {
                           @Override
                            public void onSuccess(Void aVoid) {


                           ProfileFragment prf = new ProfileFragment();

                          android.support.v4.app.FragmentTransaction fragmentTransaction =getFragmentManager().beginTransaction();

                          fragmentTransaction.replace(R.id.fragment_container, prf).commit();


                                                        }
                                                    });


                                                }
                                            });


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

                  }
         })   ;




     }
  });

【讨论】:

  • 你能发布你的数据库和完整的源代码,也许是任何存储库的链接
  • 我什至不知道你从数据库中删除后要提交什么
  • 我无权分享整个代码,抱歉 :( 。请查看我的最新评论。
  • 您能在此处提供 VCS 链接吗?最好是github.com
  • 除了代码之外,我还必须做的另一件事是在父片段 (SinglePostFragment) 中放置一个 try catch 块,它会在其中获取相同的帖子。这样帖子删除后代码忽略抓取,不会崩溃。