【问题标题】:Boolean variable is not setting ,when reading firestore data读取 Firestore 数据时未设置布尔变量
【发布时间】:2019-06-17 07:21:53
【问题描述】:

我正在尝试读取 FireStore 数据库中的所有数据,如果任何文档名称匹配,则布尔变量应该为 false ,否则应该为 true。但是布尔变量的值没有变化。

public boolean checkUsername(EditText editText){
    final boolean[] flag = {false};
    FirebaseFirestore db = FirebaseFirestore.getInstance();
    DocumentReference docRef = db.collection("Users").document(editText.getText().toString());
    docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            if (task.isSuccessful()) {
                DocumentSnapshot document = task.getResult();
                if (document.exists()) {
                    flag[0] =false;
                    Log.d("", "DocumentSnapshot data: " + document.getData());
                } else {
                    flag[0]=true;
                    Log.d("", "No such document");
                }
            } else {
                Log.d("", "get failed with ", task.getException());
            }
        }
    });
    return flag[0];


}

这是Firestore 数据库

收集文件

用户 jaypatel, jaypatel2212

如果编辑文本值为 jaypatel2212 或 jaypatel,则布尔变量应为 false,否则应为 true。

【问题讨论】:

  • 从 Firestore 读取是异步操作。您的函数 checkUsername 将在 Firestore 任务完成之前返回。您需要调整逻辑,将需要运行的代码移动到 CompletionListener 并使用回调而不是函数。

标签: android


【解决方案1】:

布尔标志的值不会改变,因为您已将其声明为 final。 此外,当您始终只返回和更改第 0 个元素时,也无需使用数组。

return flag 也应该在 onComplete() 函数中,因为从 firestore 读取数据是异步任务,所以即使在您可以从 firestore 获取数据之前,您也会返回 flag 的默认初始化值。所以代码应该是这样的:-

private boolean flag = false;

        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            if (task.isSuccessful()) {
                DocumentSnapshot document = task.getResult();
                if (document.exists()) {
                    flag = false;
                    Log.d("", "DocumentSnapshot data: " + document.getData());
                } else {
                    flag = true;
                    Log.d("", "No such document");
                }
            } else {
                Log.d("", "get failed with ", task.getException());
            }
          return flag;
        }

【讨论】:

  • 是的,但如果我不将标志设为一个元素数组,则会出现错误,studio autohelp 建议将其设为一个元素数组或存在编译器错误,以及删除最终没有任何区别
  • 正如@dalija 在上面的评论中所说,从firestore 读取是异步操作,因此在您的代码获取数据firestore 之前,您将返回默认情况下为false 的flag 值。因此,您需要在 else 块之后返回 onComplete() 函数范围内的标志值。 else{ } return flag; } //close of onComplete()
  • 您无法从异步完成处理程序返回函数值。这个答案是错误的,它永远不会起作用。它遇到与原始问题相同的问题。 OP 不能使用函数,它必须直接在完成处理程序中实现适当的代码,或者将另一个完成处理程序传递给方法并在 Firestore 完成处理程序中调用该处理程序。
猜你喜欢
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 2020-09-10
  • 2017-11-05
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多