0
我在这个answer阅读确实火力地堡ServerValue.TIMESTAMP工作有关ServerValue.TIMESTAMP
的ValueEventListener
将触发两次第一当地时间,然后用服务器的时间..我的问题是意志,只有发生,如果代码看起来象这种使用setValue
:如何在这种情况下
ref.addValueEventListener(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println(dataSnapshot.getValue());
}
public void onCancelled(DatabaseError databaseError) { }
});
ref.setValue(ServerValue.TIMESTAMP);
还是也发生,如果呼叫是updateChildren
这样,注意ServerValue.TIMESTAMP
Map<String, Object> someMap = new HashMap<>();
someMap.put("id", 239231);
someMap.put("time", ServerValue.TIMESTAMP);
someMap.put("name", "some name");
Map<String, Object> childUpdates = new HashMap<>();
childUpdates.put("someKey", someMap);
mFirebase.updateChildren(childUpdates, new CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
}
});
UPDATE
这是我所要做的。
在Firebase code lab for Friendly Chat app(friendlychat).我更换这个样子发送聊天消息代码:
FriendlyMessage friendlyMessage = new
FriendlyMessage(mMessageEditText.getText().toString(),
mUsername,
mPhotoUrl,
null /* no image */);
mFirebaseDatabaseReference.child(MESSAGES_CHILD)
.push().setValue(friendlyMessage);
与childUpdates
,而不是像这样:
final String pushKeyAddress = mFirebaseDatabaseReference.child(MESSAGES_CHILD).push().getKey();
Map<String, Object> someMap = new HashMap<>();
someMap.put("text", mMessageEditText.getText().toString());
someMap.put("name", mUsername);
someMap.put("photoUrl", mPhotoUrl);
someMap.put("time", ServerValue.TIMESTAMP);
Map<String, Object> childUpdates = new HashMap<>();
childUpdates.put(MESSAGES_CHILD.concat("/").concat(pushKeyAddress), someMap);
mFirebaseDatabaseReference.updateChildren(childUpdates, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
System.out.println(databaseError);
}
});
而且我看到CompletionListener
onComplete
只触发一次,而不是两次正如我所料,因为我使用了ServerValue.TIMESTAMP
在我上面的'updateChildren'示例代码中,我有一个HashMap'someMap'。如果在Firebase-databas中有两个类似于'someMap1'和'someMap2'的不同位置,并且它们都有一个'(“time”,ServerValue.TIMESTAMP);',是否会使onComplete()触发器四次? ? – Erik
每次写入'ServerValue.TIMESTAMP'将遵循与我链接的答案相同的流程。这不是你在运行代码时看到的行为吗? –
我必须做一些错误'updateChildren'' onComplete(..)'只会触发一次,但Firebase中的'(“time”,ServerValue.TIMESTAMP)'键设置好。这不是我想要了解的问题。我设置了一个断点,甚至做了'System.out.println(dataSnapshot.getValue()); '也许这是因为'setPersistenceEnabled(true)'.. mmm – Erik