2017-08-10 251 views
0

我在這個answer閱讀確實火力地堡ServerValue.TIMESTAMP工作有關ServerValue.TIMESTAMPValueEventListener將觸發兩次第一當地時間,然後用服務器的時間..我的問題是意志,只有發生,如果代碼看起來象這種使用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); 
        } 

       }); 

而且我看到CompletionListeneronComplete只觸發一次,而不是兩次正如我所料,因爲我使用了ServerValue.TIMESTAMP

回答

1

My answer(你在問題中鏈接)解釋了「在寫入操作中」發生了什麼。 setValue()updateChildren()也會發生同樣的情況。

+0

在我上面的'updateChildren'示例代碼中,我有一個HashMap'someMap'。如果在Firebase-databas中有兩個類似於'someMap1'和'someMap2'的不同位置,並且它們都有一個'(「time」,ServerValue.TIMESTAMP);',是否會使onComplete()觸發器四次? ? – Erik

+0

每次寫入'ServerValue.TIMESTAMP'將遵循與我鏈接的答案相同的流程。這不是你在運行代碼時看到的行爲嗎? –

+0

我必須做一些錯誤'updateChildren'' onComplete(..)'只會觸發一次,但Firebase中的'(「time」,ServerValue.TIMESTAMP)'鍵設置好。這不是我想要了解的問題。我設置了一個斷點,甚至做了'System.out.println(dataSnapshot.getValue()); '也許這是因爲'setPersistenceEnabled(true)'.. mmm – Erik