在Firestore中检查文件是否存在

时间:2019-10-17 12:39:11

标签: android google-cloud-firestore

我正在尝试查找数据库中是否存在某些项目。

如果它不存在,我想添加它。

如果存在,我想显示一条消息。

代码使用:

CollectionReference colRefMyBooks = db.collection( "Users" ).document( auth.getUid() ).collection( "MyBooks" );
Query queryMyBooks = colRefMyBooks.whereEqualTo("BookID", bookId);
queryMyBooks.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            for (QueryDocumentSnapshot document : task.getResult()) {
                Toast.makeText(BookDetailActivity.this, "Book already in my list", Toast.LENGTH_SHORT).show();
            }
        } else {
            db.collection( "Users" ).document( auth.getUid() ).collection( "MyBooks" ).add( general_book );
        }
    }
});

只要有集合"MyBooks",此代码就可以正常工作。但是,如果没有集合"Mybooks",我希望它考虑它,因为任务不成功,因此要添加该项目。

我得到的是它跳过了整个onComplete,因此不添加任何内容。

这是否意味着我必须先检查是否存在一个集合,如果要收集,则必须在其中检查?

谢谢

1 个答案:

答案 0 :(得分:0)

没有任何文档的查询将始终被视为“成功”,无论是否存在任何集合。此行为无法更改。

您要做的是检查结果集中是否没有文档,然后从那里决定要做什么:

queryMyBooks.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            QuerySnapshot snapshot = task.getResult();
            if (snapshot.isEmpty()) {
                db.collection( "Users" ).document( auth.getUid() ).collection( "MyBooks" ).add( general_book );
            }
            else {
                for (QueryDocumentSnapshot document : snapshot) {
                    Toast.makeText(BookDetailActivity.this, "Book already in my list", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }
});

请注意,集合实际上并没有“存在”。没有添加或删除集合的操作。仅存在用于修改文档的操作。仅当集合包含至少一个文档时,该集合才会出现在控制台中。如果它不包含任何文档,它将消失。