document.exists () возвращает false из пожарного магазина - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь проверить, существует ли документ в пожарном депо.Я скопировал точное местоположение документа (col3) с консоли пожарного депо, поэтому он должен исправить.

document.exists () возвращает false, несмотря на то, что документ был сохранен в базе данных.Я следовал руководству Google с этого сайта.

Я установил точку останова и проверил объект DocumentSnapshot, но за ним очень трудно следить, например, zza, zzb, zzc ...

private fun nameExists(userId: String, colName: String): Boolean{
    val nameExists = booleanArrayOf(false)
    val docRefA = fbDb!!.document("users/X9ogJzjJyOgGBV0kmzk7brcQXhz1/finalGrades/col3")

    val docRefB = fbDb!!.collection("users")
            .document(userId)
            .collection("finalGrades")
            .document(colName)


    docRefA.get().addOnCompleteListener { task ->
        if (task.isSuccessful) {
            val document = task.result
            if (document.exists()) {
                nameExists[0] = true
            }else{
                Log.d(TAG, "no such document")
            }
        } else {
            Log.d(TAG, "get failed with ", task.exception)
        }
    }
    return nameExists[0]
}

enter image description here

1 Ответ

0 голосов
/ 16 октября 2018

Благодаря подсказкам @Frank van Puffelen я смог отладить код.Из того, что я исследовал, следующий код является классическим подходом к решению этого типа проблемы.Возможно, кто-то найдет это полезным.

Шаг 1 .Определите функциональный интерфейс с параметром того же типа, что и примитивное значение или объект, который вы хотите вернуть из асинхронной операции.

interface OnMetaReturnedListener{
    fun onMetaReturned(colExists: Boolean)
}

Шаг 2 .Создайте метод, передавая ссылку на интерфейс в качестве аргумента.Этот метод будет выполнять синхронную операцию.После получения значения вызовите метод функционального интерфейса и передайте полученное значение / объект в качестве аргумента метода.

private fun nameExists(metaReturnedListener: OnMetaReturnedListener, colName: String){

    val userId = fbAuth!!.uid!!

    val docRefB: DocumentReference = fbDb!!.collection("users")
            .document(userId)
            .collection("finalGrades")
            .document(colName)

    docRefB.get().addOnCompleteListener { task ->
        if (task.isSuccessful) {
            val doc: DocumentSnapshot = task.result!!
            val colExists = doc.exists()

            metaReturnedListener.onMetaReturned(colExists)
        } else {
            Log.d(TAG, "get failed with ", task.exception)
        }
    }
}

Шаг 3 .Вызовите метод, определенный на шаге 2. Передайте объект, который вы определили на шаге 1. Этот объект будет вызываться из метода на шаге 2, поэтому переопределенный метод получит значение / объект в качестве параметра, который затем можно назначить дляпеременная того же типа.Вы также можете передавать другие параметры других типов, но вы должны обновить сигнатуру метода в шаге 2

fun saveModulesToFirestore(colName: String, saveCode: String) {

    var collectionExists = false

    if (saveCode == FirebaseHelper.ADD_TO_COLLECTION){
        nameExists(object: OnMetaReturnedListener{
            override fun onMetaReturned(colExists: Boolean) {
                collectionExists = colExists
                if (collectionExists){
                    val dialog = CollectionExistsDialogFragment.newInstance()
                    dialog.show(fragmentManager, DIALOG_COLLECTION_EXISTS)
                    return
                } else{
                    addNewCollectionToFirebase(colName)
                }
            }
        }, colName)
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...