在我的项目中,Firebase中有两个数据库。一个是针对所有帖子的名为BlogPosts
的通用数据库,而一个针对特定用户过滤的帖子的名为UserPosts
的数据库。从BlogPosts
中可以获得必要的数据,以便转到UserPosts
中的特定帖子(在我在此处添加的文档中已完成此操作)。我想建立一个系统,以便从主页(在其中检索到BlogPosts
的地方删除一些帖子时,它将从Firebase数据库的BlogPosts
和UserPosts
中删除数据。但是,每次我运行我的应用并尝试删除一些帖子时,系统就会崩溃。
这是我的特定代码:
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)
答案 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) {
}
}) ;
}
});