我正在尝试使用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
答案 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();