Cloud Firestore live Данные изменяются как база данных в реальном времени - PullRequest
0 голосов
/ 22 апреля 2020

Я работаю над проектом, который до сих пор использовал базу данных Firebase в реальном времени. Но теперь я хочу переключиться на облачное хранилище, поэтому я преобразовал хранилище пользователя в хранилище и отключил базу данных в реальном времени. Но теперь в этой ситуации я застрял. я читал некоторые do c из firebase, но все еще запутался как новичок ie.

private fun checkFollowingStatus(uid: String, followButton: Button)
    {
    val followingRef = firebaseUser?.uid.let { it1 ->
        FirebaseDatabase.getInstance().reference
                .child("Follow").child(it1.toString())
                .child("Following")
    }
    followingRef.addValueEventListener(object : ValueEventListener
    {
        override fun onDataChange(datasnapshot: DataSnapshot) {
            if (datasnapshot.child(uid).exists()) {
                followButton.text = "Following"
            }
            else{
                followButton.text = "Follow"
            }
        }
        override fun onCancelled(p0: DatabaseError) {
        }
    })
}

Это работало очень хорошо в базе данных реального времени, но во время преобразования базы данных я попробовал приведенный ниже код, но застрял здесь.

private fun checkFollowingStatus(uid: String, followButton: Button)
    {
        val followingRef = firebaseUser?.uid.let { it1 ->
            FirebaseFirestore.getInstance()
                    .collection("Follow").document(it1.toString())
                    .collection("Following")
        }
        followingRef.addSnapshotListener(object : EventListener<QuerySnapshot>{
            override fun onEvent(p0: QuerySnapshot?, p1: FirebaseFirestoreException?) {
                if (datasnapshot.child(uid).exists()) { //error: unresolved reference datasnapshot
                    followButton.text = "Following"
                }
                else{
                    followButton.text = "Follow"
                }
            }
        })
    }

Я просто хочу, чтобы, когда пользователь нажимал при нажатии кнопки пользовательский идентификатор пользователя сохраняется в следующей коллекции и в соответствии с этим текстом кнопки изменяется.

1 Ответ

1 голос
/ 22 апреля 2020

Похоже, вы хотите проверить, существует ли документ во вложенной коллекции.

Ваш существующий код загружает всю вложенную коллекцию и пытается проверить один документ на стороне клиента, что бесполезно, даже если вы его сделаете работа.

Вместо этого вы можете просто попытаться загрузить этот единственный документ и проверить, получите ли вы результат.

val followingRef = firebaseUser?.uid.let { it1 ->
    FirebaseFirestore.getInstance()
            .collection("Follow").document(it1.toString())
            .collection("Following").document(uid)
}
followingRef.addSnapshotListener{ snapshot, e
        if (e != null) {
            Log.w(TAG, "Listen failed.", e)
            return@addSnapshotListener
        }
        if (snapshot != null && snapshot.exists()) { 
            followButton.text = "Following"
        }
        else{
            followButton.text = "Follow"
        }
    }
})

Несколько дополнительных замечаний, которые следует отметить здесь:

  • Внесенные мною изменения в основном являются копией документации , получающей обновления в реальном времени из Firestore . Поэтому, если есть ошибка, не забудьте проверить эту ссылку для получения дополнительной информации и примеров.
  • Вашему исходному коду для базы данных реального времени также не нужно было загружать весь узел Following, чтобы проверить наличие один дочерний узел. Я настоятельно рекомендую проверить весь ваш код для этого шаблона, так как загрузка большего количества данных, чем необходимо, приводит к потере пропускной способности как вашей, так и вашего пользователя.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...