【问题标题】:Checking if a collection exists in Firestore before creating it在创建之前检查 Firestore 中是否存在集合
【发布时间】:2017-10-19 18:14:46
【问题描述】:

上下文:我的应用程序目前允许用户使用用户名创建一个帐户。单击confirm - 创建帐户后,将对用户名 进行检查,以验证它不作为文档存在于usernames 集合中,即这只允许唯一的应用程序中的用户名。

用户名是在创建视图时添加到地图中的——在用户按下confirm按钮之前(我知道这是根本问题)

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 字段,允许两个用户拥有相同的用户名:

我不确定如何解决这个问题,因为在验证发生之前可能无法完成对 usernames 集合中所有文档的检索。

【问题讨论】:

    标签: android firebase race-condition google-cloud-firestore


    【解决方案1】:

    如果您的用户必须拥有唯一的用户名,那么正确执行此操作的唯一方法是使用transaction。在您的交易中,阅读您尝试注册的特定用户名:

    • 如果用户名存在:向用户询问其他用户名
    • 否则设置用户记录。

    事务保证两个操作原子发生。

    请注意,Firestore 事务仅在在线时有效。如果您尝试在没有网络连接的情况下运行事务,它会在几次尝试后失败。在这种情况下,您需要在用户有网络连接时提示他们进行注册。

    【讨论】:

    • 我尝试将其合并到我的应用程序中,但出现“未验证”错误。此外,当按照文档中的示例作为参考时,我最终得到的用户名文档“出现”就好像它存在一样,所以我无法检查它是否不存在。你能举个例子吗?
    猜你喜欢
    • 2020-11-17
    • 1970-01-01
    • 2019-04-19
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2020-07-29
    • 2019-01-21
    • 2021-09-15
    相关资源
    最近更新 更多