【问题标题】:Firebase Query Threads And Deleting Multiple DocumentsFirebase 查询线程和删除多个文档
【发布时间】:2018-05-11 13:02:59
【问题描述】:

我有两个问题:

第一个:

我想在删除所有对象完成时调用doSomethingOnce(),但我只需要调用它一次,所以//Position1不是调用它的地方,因为它在一个循环中,所以它会被多次调用次。 //Position2 也不起作用,因为根据我的理解和日志测试,它在所有删除完成之前被调用。全部删除完成后如何调用函数?

第二个:

删除多个文档实际上并不能以这种方式工作。 .delete() 在循环中最多执行 3 次,所以当我有 15 个文档时,我需要调用这个 for(String id : Ids) 循环并删除 5 次。我怎样才能删除更多的那 3 个文件?

FirebaseFirestore.getInstance().collection("test")
    .whereEqualTo("userID", user.getUid())
    .get()
    .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if(task.isSuccessful()){
                if(task.getResult().size() > 0) {
                    List<String> Ids = new ArrayList<>();
                    for(QueryDocumentSnapshot documentSnapshot : task.getResult()) {
                        Ids.add(documentSnapshot.getId());
                    }

                    for(String id : Ids) {
                        FirebaseFirestore.getInstance().collection("test").document(id).delete().addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {

                                //Position1
                                Toast.makeText(SettingsActivity.this, "Deleted", Toast.LENGTH_SHORT).show();
                            }
                        });
                    }

                    //Position2
                } else {
                    Toast.makeText(SettingsActivity.this, "Nothing found", Toast.LENGTH_SHORT).show();
                }
            } else {
                Toast.makeText(SettingsActivity.this, "Something went wrong", Toast.LENGTH_SHORT).show();
            }
        }
    });

【问题讨论】:

    标签: android firebase google-cloud-firestore


    【解决方案1】:

    当您致电Document.delete() 时,您会收到一个任务。要在完成多项任务后执行某些工作,请使用Tasks.whenAll(...)

    Task<Void> Tasks.whenAll(Task...<?> tasks)
    

    比如:

    ArrayList<Task<Void>> tasks = new ArrayList<Task<Void>>();
    for(String id : Ids) {
        tasks.add(FirebaseFirestore.getInstance().collection("test").document(id).delete());
    }
    Tasks.whenAll(tasks).addOnSuccessListener(new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {
            Toast.makeText(SettingsActivity.this, "Deleted", Toast.LENGTH_SHORT).show();
        }
    });
    

    我推荐阅读 Doug 的blog series on "becoming a task master"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-23
      • 1970-01-01
      • 2019-05-28
      相关资源
      最近更新 更多