如何检查Firestore中具有相同ID的文档是否已存在

时间:2020-08-07 15:31:09

标签: android database kotlin mvvm google-cloud-firestore

我已经在viewModel中创建了一个函数来检查文档是否已存在于Firestore数据库中

fun isUserRegistered() {

    val userRef = firebaseRepository.firestoreDB.collection("users").document(firebaseRepository.userid.toString())
        userRef.get()
            .addOnSuccessListener { document ->
                if (document != null)
                    userExists = true
            }
}

如果文档存在,则布尔值userExists应该从“ false”更改为“ true”

在我的片段中,我在onActivityResultMethod中调用该函数

viewModel.isUserRegistered()
            if(viewModel.userExists)
                findNavController().navigate(R.id.action_startFragment_to_mainFragment)
            

userExists的值始终为“ false”。我在哪里犯错了?

2 个答案:

答案 0 :(得分:1)

问题在于get()是异步的,并且在查询完成之前立即返回。您的成功侦听器要到一段时间后才会被调用。您无法保证需要多长时间。

您的第二段代码可能正在尝试在监听器中分配userExists之前对其进行访问,这意味着它将看到false的默认值。

由于您不知道get()将花费多长时间,因此您应该研究使用LiveData捕获结果,并编写代码观察该LiveData以便在查询查询完成时知道。

答案 1 :(得分:0)

您可以使用 .where( field, isEqualTo: 查询)。这可能对您有用。

checkExists(String query) async {
  QuerySnapshot checker = await userRef
      .where('uid', isEqualTo: query)
      .get();

  chkr.docs.forEach((doc) {
    if (doc.exists) {
      print('Exists');
      print(doc.get('uid'));
    }else {
      print('false');
    }
  });
}

然后,如果您使用按钮,则可以使用 onPressed: () => check(yourQuery)