从firebase中删除项目的正确方法

Posted

技术标签:

【中文标题】从firebase中删除项目的正确方法【英文标题】:correct way of deleting items from firebase 【发布时间】:2020-05-15 08:50:54 【问题描述】:

我正在尝试使用 removeValue() 从我的数据库中删除项目。当我做我的应用程序崩溃时,因为 onChange 方法中显然有一个空指针。

从数据库中删除值以防止我的应用崩溃的最佳方法是什么?

这些是我要删除的值

 DatabaseReference detailref = bookingref.child("Bookings").child(customerid);
    detailref.child("Housenumber").removeValue();
    detailref.child("Address").removeValue();
    detailref.child("Postcode").removeValue();
    detailref.child("Phone").removeValue();
    detailref.child("Date").removeValue();

在另一个活动中,我使用值事件监听器调用它们。

public void onDataChange(@NonNull DataSnapshot dataSnapshot) 
            if (dataSnapshot.getChildrenCount()!=0)
                house = dataSnapshot.child("Housenumber").getValue().toString();
                address = dataSnapshot.child("Address").getValue().toString();
                postcode = dataSnapshot.child("Postcode").getValue().toString();
                phone = dataSnapshot.child("Phone").getValue().toString();
                date = dataSnapshot.child("Date").getValue().toString();

这是来自我的 Logcat 的空指针错误

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
    at studios.p9p.h20.showroomfinish_adminapp.Booking_details$4.onDataChange

【问题讨论】:

如果请求的位置没有数据,getValue() 将返回 null。你需要检查一下。 我知道原因,但我该如何检查呢? 就像 Java 中的任何其他 null 检查一样。 我还要指出,您在标题中的问题是关于如何删除内容,但您显示的代码都没有删除任何内容。您只显示了一些查询的处理,其结果丢失。在我看来,您可能确实删除了正确的内容,而您只是想检查它们是否真的被删除了?我不清楚。 感谢您的帮助! 【参考方案1】:

您能否详细说明您要做什么? 我认为它崩溃了,因为您要单独删除值。如果您尝试删除所有子数据,您可以尝试类似

 DatabaseReference detailref = bookingref.child("Bookings").child(customerid);
 detailref.removeValue();

如果没有,也许您可​​以在尝试获取值之前检查它是否存在... 不是最好或美丽的方式,但它可能会奏效......

public void onDataChange(@NonNull DataSnapshot dataSnapshot) 
  if(dataSnapshot.exists()
     
        if (dataSnapshot.getChildrenCount()!=0)
            if(dataSnapshot.hasChild("Housenumber")
           
            house = dataSnapshot.child("Housenumber").getValue().toString();
            
            if(dataSnapshot.hasChild("Address")
            
            address = dataSnapshot.child("Address").getValue().toString();
            
            if(dataSnapshot.hasChild("Postcode")
            
            postcode = dataSnapshot.child("Postcode").getValue().toString();
            
            if(dataSnapshot.hasChild("Phone")
            
            phone = dataSnapshot.child("Phone").getValue().toString();
            
            if(dataSnapshot.hasChild("Date")
            
            date = dataSnapshot.child("Date").getValue().toString();
            
      

希望这会有所帮助:)

【讨论】:

很好用,请参阅下面关于我如何使用它的答案。谢谢【参考方案2】:

我使用了上面的答案,但方式更简单。我创建了一个名为 bookingModel() 的 firebase 模型,其中包含我所有的字符串,然后在我的 ondataChange() 中,我可以更改下面的所有笨重代码:)

house = dataSnapshot.child("Housenumber").getValue().toString();
address = dataSnapshot.child("Address").getValue().toString();
postcode = dataSnapshot.child("Postcode").getValue().toString();
phone = dataSnapshot.child("Phone").getValue().toString();
date = dataSnapshot.child("Date").getValue().toString();

id 已经获得了一个名为 customerId 的引用节点的用户 ID 字符串 所以我在我的 onDataChanged() 中使用了这个

if(dataSnapshot.hasChild(customerId))
bookingModel firebase_model = 
dataSnapshot.child(customerId).getValue(bookingModel.class)

然后删除我调用

detailRef.child(customerId).removeValue();

【讨论】:

以上是关于从firebase中删除项目的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 android studio java Recycler 视图从 Firebase 实时数据库中删除一个节点

Flutter 和 Firebase:从 Firebase 中的数组中删除项目(地图)

在 React 应用程序中为 Firebase 正确的 Typescript 类型

Crashlytics Fabric.io 已弃用

Firebase Firestore:从文档数组中追加/删除项目

Uncaught FirebaseError: Firebase: No Firebase App '[DEFAULT]' has been created - 在 vue.js 中调用 Fireba