onChildRemoved()方法多次调用,即使我的firebase数据中只有一个子节点

时间:2016-01-05 11:01:08

标签: android firebase

我在firebase网址中只有一个孩子,我会定期更新它的值。但是,当我改变孩子的价值时,我不知道为什么onChildAdded()会调用。

onChildRemoved()也被多次调用,当我从firebase url中删除子项时,即使子项只有一个。 火力资料数据 http://i.stack.imgur.com/qP6Sj.png

注意

我定期使用服务

更改节点的值

childeventlistener = new ChildEventListener(){

                    @Override
                    public void onChildRemoved(DataSnapshot arg0) {

                        Log.e("child_removed", "");

//当我从firebase删除节点时,多次打印此日志。                         }

                    @Override
                    public void onChildMoved(DataSnapshot arg0, String arg1) {
                        // TODO Auto-generated method stub

                    }

                    @Override
                    public void onChildChanged(DataSnapshot arg0,
                            String arg1) {
                        // TODO Auto-generated method stub
                        try {
                            String firebase_get_value = arg0.getValue()
                                    .toString();

                            Log.e("firebase get value", firebase_get_value
                                    + "");

                            locationDetails = new Gson().fromJson(
                                    firebase_get_value,
                                    new TypeToken<BeanFireBase>() {
                                    }.getType());

                            lat_from_firebase = locationDetails
                                    .getLatitude();
                            lon_from_firebase = locationDetails
                                    .getLongitude();
                            timestamp_from_firebase = locationDetails
                                    .getTimestamp();

                            accuracy_from_firebase = locationDetails
                                    .getAccuracy();

                            latitude_from_fb = Double.valueOf(
                                    lat_from_firebase).doubleValue();
                            longitude_from_fb = Double.valueOf(
                                    lon_from_firebase).doubleValue();

                        } catch (Exception exception) {

                            Log.e("Exception--->",
                                    "" + exception.getMessage());

                        }

                    }

                    @Override
                    public void onChildAdded(DataSnapshot arg0,
                            String previousChildName) {
                        // TODO Auto-generated method stub

                        Toast.makeText(getApplicationContext(),
                                "onChildAddedCalled" + previousChildName,
                                Toast.LENGTH_LONG).show();



                        try {
                            String firebase_get_value = arg0.getValue()
                                    .toString();

                            locationDetails = new Gson().fromJson(
                                    firebase_get_value,
                                    new TypeToken<BeanFireBase>() {
                                    }.getType());

                            lat_from_firebase = locationDetails
                                    .getLatitude();
                            lon_from_firebase = locationDetails
                                    .getLongitude();
                            timestamp_from_firebase = locationDetails
                                    .getTimestamp();

                            accuracy_from_firebase = locationDetails
                                    .getAccuracy();

                            latitude_from_fb = Double.valueOf(
                                    lat_from_firebase).doubleValue();
                            longitude_from_fb = Double.valueOf(
                                    lon_from_firebase).doubleValue();

                        } catch (Exception exception) {

                            Log.e("Exception--->",
                                    "" + exception.getMessage());
                        }
                    }

                    @Override
                    public void onCancelled(FirebaseError arg0) {
                        // TODO Auto-generated method stub
                    }
                };

                myFirebaseRef.child("" + code_to_track)
                        .addChildEventListener(
                                childeventlistener);

//i have used below code to set and update data on firebase
Map<String, Object> updates = new HashMap<String, Object>();
            updates.put("lat", "" + latitude_to_send);
            updates.put("lon", "" + longitude_to_send);
            updates.put("timestamp", "" + time_millis_to_send);
            updates.put("accuracy", "" + accuracy_to_send);
            myFirebaseRef.child("" + set_child).child("LocationInfo").updateChildren(updates);

// and this is how i delete node from firebase
myFirebaseRef.child("" + set_child).removeValue();

1 个答案:

答案 0 :(得分:0)

您没有更改孩子的价值,但实际上是在创建一个名为set_child的新孩子,并将其添加到您的users节点。您不应为您的子节点生成随机名称,而应使用push()插入新节点,因为push()将自动为您的子节点生成唯一名称。

setValue()将数据保存到指定的Firebase引用,替换该路径上的所有现有数据,这意味着它会删除当前路径并使用您指定的新值重新插入它。 而updateChildren()将保持路径不变,只需替换最终值。

注意

此处set_child应该是已有的孩子,否则会为您的users添加新的孩子,因此onChildAdded()会被调用。

这是更新users节点已存在子节点值的方法。

Map<String, String> updates = new HashMap<String, String>();
updates.put("lat", "" + latitude_to_send);
updates.put("lon", "" + longitude_to_send); 
updates.put("timestamp", "" + time_millis_to_send); 
updates.put("accuracy", "" + accuracy_to_send); 
myFirebaseRef.child("" + set_child).child("LocationInfo") .updateChildren(updates);