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