2017-10-19 75 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'错误。另外,当以文档中的示例作为参考时,我最终会看到用户名文档“出现”,好像它存在一样,所以我无法检查它是否不存在。 你能否提供一个例子。 –

相关问题