2017-10-19 178 views
0

上下文:我的應用程序當前允許用戶創建一個帳戶,其中用戶名。點擊confirm - 創建一個帳戶,在用戶名上運行檢查以驗證它不存在於usernames集合內的文檔中,即,這隻允許在應用程序中唯一的用戶名。在創建之前檢查Firestore中是否存在一個集合

的用戶名添加至地圖時視圖創建 - 之前用戶按壓confirm按鈕(I明白,這是潛在的問題)

public static void getAllNonAvailableUsernames() { 
    FirebaseFirestore.getInstance() 
      .collection("usernames") 
      .get().addOnCompleteListener(task -> { 
       List<DocumentSnapshot> snapshots = task.getResult().getDocuments(); 
       for (DocumentSnapshot snap : snapshots) { 
        usedUsernames.put(snap.getId(), snap.get("owner")); 
       } 
      }); 
} 

一個問題產生當兩個用戶碰巧選擇相同的用戶名進行註冊時。最後一個請求被處理,並覆蓋文檔中owner場,同時允許用戶擁有相同的用戶名

Format of the usernames collection

我不知道該如何去解決這個問題,因爲檢索在驗證發生之前,usernames集合中的所有文檔可能沒有完成。

回答

1

如果您的用戶必須擁有唯一的用戶名,唯一正確執行此操作的方法是使用transaction。在您的交易,請閱讀特定的用戶名你想即可登錄:

  • 如果用戶名存在:要求用戶提供不同的用戶名
  • 否則,設置用戶記錄了。

交易保證這兩個操作都是自動發生的。

請注意,Firestore交易只能在線上使用。如果您嘗試在沒有網絡連接的情況下運行事務,它將在幾次嘗試後失敗。在這種情況下,您需要提示您的用戶在網絡連接時註冊。

+0

我試圖將其納入我的應用程序,但我得到'NOTAUTHENTICATED'錯誤。另外,當以文檔中的示例作爲參考時,我最終會看到用戶名文檔「出現」,好像它存在一樣,所以我無法檢查它是否不存在。 你能否提供一個例子。 –

相關問題