我在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();
答案 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);