2017-10-19 69 views
0

我想在Firebase中設置類似羣聊的內容。 如果你有正確的組ID,你可以加入。如何收聽Firebase setValue完成

問題是Firebase引用始終存在。它們是動態創建的。爲了在加入過程中允許一些錯誤檢查,我想將創建新數據庫條目的用戶添加到用戶表中。

public void createParty() { 

    // you need to be signed in to create a party 
    assertState(DBState.SignedIn); 

    // create a new party 
    ourPartyDatabaseReference = partiesDatabaseReference.push(); 
    usersDatabaseReference = ourPartyDatabaseReference.child("users"); 

    // write our user to the table of users, now the ourPartyReference actually exists 
    // and if you look for existing users, you will always find at least the original creator 
    Task initTask = usersDatabaseReference.child(user.getUid()).setValue(true); 

後這樣做了,我叫一個輔助方法connectToParty建立一些參考和更改數據庫連接DBState.Connected的狀態。現在你可以把派對的鑰匙傳送給其他用戶。關鍵我的意思是在firebase中的名稱。

問題是:其他用戶需要檢查他們是否使用了有效的密鑰進行連接。他們通過檢查key/users是否有數據來做到這一點。所以該方只有在第一個用戶已經成功寫入數據庫時​​纔有效。

有時寫入過程需要很長時間,有時看起來完全失敗。所以我設立了聽衆:

Task initTask = usersDatabaseReference.child(user.getUid()).setValue(true); 

initTask.addOnSuccessListener(new OnSuccessListener() { 
    @Override 
    public void onSuccess(Object o) { 
     connectToParty(); 
    } 
}); 

initTask.addOnFailureListener(new OnFailureListener() { 
    @Override 
    public void onFailure(@NonNull Exception e) { 
     changeState(DBState.SignedIn, DBTransition.Failure); 
    } 
}); 

這包括在測試中。測試建立連接,登錄並創建派對。如果派對在特定的超時時間內創建,則測試通過。

9的10倍這工作沒有問題。 但有時候測試失敗。

這與暫停時間短暫無關。這個任務的回調函數根本不會被調用。 我讀過這個回調只適用於你的連接在線。

因此我在任務之前將firebaseDatabase.goOnline();添加到了我的代碼中。但是這並沒有幫助。

我通過局域網連接到互聯網。所有其他測試都通過了,他們也需要訪問Firebase。例如對於登錄過程。

將值寫入數據庫並等待寫入完成的正確方法是什麼?

+0

有什麼錯誤時,測試失敗? –

+0

這是暫停。我等待回調10秒鐘,然後測試失敗。 – lhk

+0

因此,這兩者都不被稱爲 – lhk

回答

1

正如offical documentation說:

如果你想知道當你的數據發生了,你可以添加一個完成監聽器。 setValue()和updateChildren()都帶有一個可選的完成監聽器,當寫入已經提交給數據庫時會被調用。

這是一個簡單的例子:

ref.setValue("I'm writing data to a Firebase database", new Firebase.CompletionListener() { 
    @Override 
    public void onComplete(FirebaseError firebaseError, Firebase firebase) { 
     if (firebaseError != null) { 
      System.out.println("Data could not be saved. " + firebaseError.getMessage()); 
     } else { 
      System.out.println("Data saved successfully."); 
     } 
    } 
}); 
+0

這實際上是我第一次嘗試。同樣的問題。 – lhk

+0

您是否嘗試過使用'setPersistenceEnabled(true);'?這意味着您可以將數據庫中的數據保存在兩個位置:內存和/或磁盤上。您也可以使用'keepSynced(true)',這意味着應用程序中的數據將始終與服務器上的數據庫中的內容(只要存在網絡連接)保持最新。 –

+1

我已經嘗試了兩種。問題不再發生。我已經刪除了新的代碼,問題不再發生。調試這種非確定性行爲是非常困難的。 – lhk