Firebase数据库内容删除

时间:2018-08-05 12:42:45

标签: android firebase firebase-realtime-database nullpointerexception

在我的项目中,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)

1 个答案:

答案 0 :(得分:0)

您错在哪里以不同的方式运行代码。如果第一个事务太重而无法加载,它将继续其他事务,并将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) {

                  }
         })   ;




     }
  });