【问题标题】:How to check if the document with the same id in firestore already exists如何检查firestore中具有相同id的文档是否已经存在
【发布时间】:2020-11-27 23:20:55
【问题描述】:

我在 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'

在我的 Fragment 中,我正在调用 onActivityResultMethod 中的函数

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

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

【问题讨论】:

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


    【解决方案1】:

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

    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)

    【讨论】:

      【解决方案2】:

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

      您的第二段代码可能是在分配到侦听器之前尝试访问userExists,这意味着它将看到默认值false

      由于您不知道get() 需要多长时间,您应该考虑使用 LiveData 来捕获结果,并编写代码来观察 LiveData 以了解查询何时完成。

      【讨论】:

        猜你喜欢
        • 2019-09-24
        • 2014-10-06
        • 1970-01-01
        • 2021-07-22
        • 2021-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多