2017-08-10 165 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