【问题标题】:How to check if Cloud Firestore collection exists? ( querysnapshot)如何检查 Cloud Firestore 集合是否存在? (查询快照)
【发布时间】:2018-06-11 02:49:00
【问题描述】:

我无法检查我的收藏是否存在于 Firestore 数据库中。 当我使用 Firebase 实时数据库时,我可以使用:

if(databaseSnapshot.exists) 

现在有了 Firestore,我也想做同样的事情。 我已经试过了

  if (documentSnapshots.size() < 0) 

但它不起作用。 这是当前代码:

public void pullShopItemsFromDatabase() {
    mShopItemsRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                for (DocumentSnapshot document : task.getResult()) {
                    ShopItem shopItem = document.toObject(ShopItem.class);
                    shopItems.add(new ShopItem(shopItem.getImageUrl(), shopItem.getTitle(), shopItem.getSummary(), shopItem.getPowerLinkID(), shopItem.getlinkToShopItem(),shopItem.getLinkToFastPurchase(), shopItem.getKey(), shopItem.getPrice(),shopItem.getVideoID()));
                }
                if (shopItems != null) {
                    Collections.sort(shopItems);
                    initShopItemsRecyclerView();
                }
            } else {
                Log.w(TAG, "Error getting documents.", task.getException());
                setNothingToShow();
            }
        }
    });
}

函数:setNothingToShow(); 如果我的收藏为空/不存在,这实际上是我想要执行的。 请指教! 谢谢, D.

【问题讨论】:

  • if (documentSnapshots.size() &lt; 0) 永远不会是真的。它应该是if (documentSnapshots.size() == 0)if (documentSnapshots.size() &gt; 0)(取决于你把它放在哪里)。
  • @FrankvanPuffelen 好的!我不知道发生了什么,但现在它起作用了。我以前尝试过
  • onSuccess 在任务完成并成功时触发。一个没有加载任何数据就完成的任务,因为它不需要加载任何数据,也成功了。所以onSuccess 也可以在那里工作。
  • @FrankvanPuffelen 再次感谢。我看过云Firestore的介绍视频,他在“新”关键字之前的“OnSuccess”上使用“this”监听器。所有这些都在 onStart 上实现自动刷新内容。在片段上使用此方法时,我注意到它可能会破坏片段事务,我假设因为它与几个 onStart 方法发生冲突(因为每个片段都实现它)有什么建议可以避免它吗?
  • 我对事务生命周期不太熟悉,所以帮不上忙。

标签: java android database firebase google-cloud-firestore


【解决方案1】:

使用DocumentSnapshot.size() &gt; 0检查集合是否存在。

这是我的代码中的一个示例:

  db.collection("rooms").whereEqualTo("pairId",finalpairs)
         .get()
         .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                if(task.getResult().size() > 0) {
                    for (DocumentSnapshot document : task.getResult()) {
                        Log.d(FTAG, "Room already exists, start the chat");

                    }
                } else {
                    Log.d(FTAG, "room doesn't exist create a new room");

                }
            } else {
                Log.d(FTAG, "Error getting documents: ", task.getException());
            }
        }
    });

【讨论】:

    【解决方案2】:

    exists() 适用于DocumentSnapshot,而您正在处理QuerySnapshot

    调用 task.result 以从 Task&lt;QuerySnapshot&gt; 中获取 QuerySnapshot

    然后,调用result.getDocuments() 并遍历每个DocumentSnapshot 调用exists()

    【讨论】:

    • 谢谢!其实我找到了一种不同的方法,但它确实有助于满足未来的需求。
    • @DaniyyelTouboul 如果这个答案有帮助,你应该点赞。只有当它回答了您提出的问题时,您才应该接受它,而它似乎没有这样做。
    • @FrankvanPuffelen 不幸的是我还不能投票。我的用户仍然受到限制。
    • @WhiteNinja 你能分享你的方法吗?
    猜你喜欢
    • 1970-01-01
    • 2020-11-17
    • 2019-09-03
    • 2019-01-21
    • 2022-01-24
    • 2021-12-22
    • 2018-11-10
    • 2021-06-17
    • 1970-01-01
    相关资源
    最近更新 更多