firebase onChildAdded首次为空

时间:2017-05-30 13:45:09

标签: android firebase firebase-realtime-database

我正在使用Firebase开发应用,以实时检索数据。我有2台设备,并连接到Firebase,当第一台设备向Firebase添加了一些数据时,第二台设备的工作就是抓取这些数据。但是它总是在它第一次捕获时崩溃并且崩溃,然后如果我重新打开应用程序,那很好。有人能帮助我吗?

这是我的代码:

mDB= FirebaseDatabase.getInstance().getReference();
        mListItemRef = mDB.child("university/"+studencode);

    mListItemRef.addChildEventListener(new ChildEventListener() {
                @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
        public void onChildAdded(com.google.firebase.database.DataSnapshot dataSnapshot, String s) {
            FirebaseVariable university = dataSnapshot.getValue(FirebaseVariable.class);


            if (university.getStatus().equals("0")){
                createNotification();

                Intent registerIntent = new Intent(MainActivityPerawat.this, Activity_Receiver.class);
                registerIntent.putExtra("data",university.getData);
                MainActivityPerawat.this.startActivity(registerIntent);

                Log.e("HAHA ",university.getData() );
            }
        }
    });

但是当它第一次实时反复时它为空。

编辑:这是我的错误

     05-30 21:14:20.249 27974-27974/com.sinergiz 
    E/UncaughtException: java.lang.NullPointerException: 
    Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' 
on a null object reference

我尝试简单记录

05-30 21:20:01.315 28948-28948/com.sinergiz E/HAHA: null

编辑第2部分:

这是我的插入数据

Firebase mRefstatus = mRef.child("status");
                mRefstatus.setValue("0");

当我重新打开应用程序时。很好,这是我的

这是通过与孩子同时插入数据来解决的,下面是示例代码

Map<String, String> map2 = new HashMap<String, String>();
                map2.put("data1", data1);
                map2.put("data2", data2);
mRef = new Firebase("your firebase url);
                mRef.setValue(map2);
有一个美好的日子!

1 个答案:

答案 0 :(得分:1)

这似乎是一个单独写的价值而不是作为一个对象的案例。 (虽然这有时是正确的事情)。

因此,如果我将虚构的数据点添加到问题中包含的数据点,我们可能会:

DatabaseReference mRefSomeProperty = mRef.child("someProperty");
DatabaseReference mRefstatus = mRef.child("status");

mRefSomeProperty.setValue("someValue");
mRefstatus.setValue("0");

这两个setValue调用是单独的写操作,如果你有一个监听器,它不会等待写两个值,第一个setValue用于&#34; someProperty&#34 ;将触发听众,如果你的听众试图用&#34; status&#34;它会引起问题,状态还没有。

您可以在设置值时尝试使用数据类,方法与获取值时使用的类似。所以我们的代码看起来像:

FirebaseVariable university = new FirebaseVariable("someValue", "0");
mRef.setValue(university);

这假设FirebaseVariable具有这两个属性以及构造函数,可以使用setStatus或其他方式来创建对象。

现在应将其视为一个写操作,以便在触发侦听器时所有内容都存在,而不是在写入第一个值时先触发。