从Firebase删除项目的正确方法

时间:2020-01-29 19:21:36

标签: java android firebase firebase-realtime-database nullpointerexception

我正在尝试使用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

2 个答案:

答案 0 :(得分:2)

能否请您提出您打算做什么的更多细节? 我认为这很崩溃,因为您要分别删除值。如果您要删除所有子数据,则可以尝试

public class drawLine : MonoBehaviour
{

    private LineRenderer lineRenderer;
    private float counter;
    private float dist;

    public Transform origin;
    public Transform destination;
    public float lineDrawSpeed = 6f;
    private float distance;

    // Use this for initialization
    void Start()
    {
        lineRenderer = gameObject.GetComponent<LineRenderer>();
        lineRenderer.positionCount = 2;
        lineRenderer.SetPosition(0, origin.transform.position);

        distance = Vector3.Distance(origin.transform.position, destination.transform.position);
        Debug.Log(distance);
    }

    void Update()
    {

        if (counter < distance)
        {
            Debug.Log(counter);
            counter += .1f / lineDrawSpeed;
            float x = Mathf.Lerp(0, distance, counter);
            var point0 = origin.transform.position;
            var point1 = destination.transform.position;

            var pointALongLine = x * Vector3.Normalize(point1 - point0) + point0;

            lineRenderer.SetPosition(1, pointALongLine);
        }

    }
}

如果不存在,也许您可​​以在尝试获取值之前检查它是否存在... 并非达到此目的的最佳方法,但它可能会起作用...

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

希望这会有所帮助:)

答案 1 :(得分:0)

我使用了上面的答案,但是使用的方式要简单得多。我创建了一个带有所有字符串的firebase模型,名为bookingModel(),然后在我的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已经获得了名为客户ID的引用节点的用户ID字符串 所以我在onDataChanged()

中使用了它
if(dataSnapshot.hasChild(customerId))
bookingModel firebase_model = 
dataSnapshot.child(customerId).getValue(bookingModel.class)

然后删除我的通话

detailRef.child(customerId).removeValue();