【问题标题】:Query Firestore data and add one field to all the documents that match the query查询 Firestore 数据并为所有匹配查询的文档添加一个字段
【发布时间】:2018-10-18 18:43:39
【问题描述】:

我正在构建一个用于销售图书的 Android 应用。我的用户可以为他们的旧书发布广告并出售它们。我计划添加一个功能,让我的用户可以选择匿名。将有名称为Make me anonymous 的复选框。如果用户选中该框,其他人将看不到他们的电话号码和姓名。只有通用名称应该是可见的。

现在的问题是,我想在用户上传的每个广告文档中添加一个条目anonymous = true

我想查询用户投放的广告并添加字段anonymous = true。我想做如下的事情:

 final CheckBox anonymousCB = findViewById(R.id.anonymousCB);
    anonymousCB.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (anonymousCB.isChecked()){
                WriteBatch batch = firestore.batch();
                DocumentReference sfRef = firestore.collection("books").whereEqualTo(uid,uid);
                batch.update(sfRef, "anonymous", "true");
            }
        }
    });

但我无法进行查询并将字段插入到与查询匹配的所有文档中。有没有更好的方法来做到这一点?

【问题讨论】:

  • 请看下面我的回答。

标签: java android firebase google-cloud-firestore


【解决方案1】:

有没有更好的方法来做到这一点?

是的,有。要解决这个问题,请在onCheckedChanged() 方法中使用以下代码行:

Query sfRef = firestore.collection("books").whereEqualTo(uid, uid);
sfRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            List<String> list = new ArrayList<>();
            for (DocumentSnapshot document : task.getResult()) {
                list.add(document.getId());
            }

            for (String id : list) {
                firestore.collection("books").document(id).update("anonymous", true).addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        Log.d(TAG, "anonymous field successfully updated!");
                    }
                });
            }
        }
    }
});

此代码的结果是将anonymous 属性添加到所有book 对象并将其设置为true。请注意,我使用了布尔值 truenot 字符串 true ,就像您在代码中使用的那样。这样用起来更方便。

P.S.如果您正在为您的书籍使用模型类,请参阅我在此 post 中的回答。

【讨论】:

  • 嗨,Karthik!你有没有试过我上面的解决方案,它有效吗?
  • 嗨,Alex,“DocumentReference sfRef = firestore.collection("books").whereEqualTo(uid, uid);"这一行是一个查询。这不能转换为 DocumentReference。当我尝试这个时,我收到“Incompatabe types”错误。如果我把它写成“Query sfRef = firestore.collection("books").whereEqualTo("uid", uid);",它就接受了。但这对我不起作用。
  • 是的,你是对的。我的错,应该是Query不是 DocumentReference,对此感到抱歉。刚刚更新了我的答案。你说接受,那很好,但为什么你说它不适合你?我亲自测试过,效果很好。
猜你喜欢
  • 2021-11-18
  • 2021-05-11
  • 1970-01-01
  • 2021-06-01
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 2021-05-30
  • 2021-01-20
相关资源
最近更新 更多