База данных Firestore в реальном времени не обновляется после запросаAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 База данных Firestore в реальном времени не обновляется после запроса

Сообщение Anonymous »

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

Код: Выделить всё

private fun sendInvite(idUzivatele: String) {
// podiva se jestli uz uzivatel pozvanku od spolecnosti nema
val invitesRef = db.child("users").child(idUzivatele).child("invites")
invitesRef.get()
.addOnSuccessListener { dataSnapshot ->
var maUzInvite = false
if (dataSnapshot.exists()) {
for (invitesSnapshot in dataSnapshot.children){
if (invitesSnapshot.child("from").getValue(String::class.java) == CompanyID){
maUzInvite = true
break
}
}
}
if (!maUzInvite){
val invitesMap = mapOf(
"from" to CompanyID
)
db.child("users").child(idUzivatele).child("invites").push().setValue(invitesMap)
.addOnSuccessListener {
Toast.makeText(
this,
"Invite sent!",
Toast.LENGTH_SHORT
).show()
}
.addOnFailureListener {
Toast.makeText(
this,
"Failed to sent invite",
Toast.LENGTH_SHORT
).show()
}
} else {
Toast.makeText(
this,
"The user already has an invitation!",
Toast.LENGTH_SHORT
).show()
}
}
.addOnFailureListener { exception ->
Log.e("RealtimeDB", "Error getting invites ", exception)
}
}
вот другой метод

Код: Выделить всё

private fun findUserByEmail(emailInput: String, callback: (String?) ->  Unit){
db.child("users").get()
.addOnSuccessListener { dataSnapshot ->
var foundUid: String? = null

// Iterace přes všechny uživatele
for (userSnapshot in dataSnapshot.children) {
val email = userSnapshot.child("email").getValue(String::class.java)
if (email == emailInput) {
foundUid = userSnapshot.key // UID je klíčem ve struktuře
break
}
}
// vraceni hodnoty pomoci funkce
callback(foundUid)
}.addOnFailureListener { exception ->
Log.e("Firebase", "Chyba při čtení uživatelů: ${exception.message}")
}

}
а вот метод, запускающий диалог

Код: Выделить всё

private fun showInviteUserPopUp(){
// Vytvoření dialogu
val dialog = Dialog(this)
dialog.setContentView(R.layout.company_manager_invite_popup)

// Nastavení velikosti dialogu
dialog.window?.setLayout(
(resources.displayMetrics.widthPixels * 0.95).toInt(),
(resources.displayMetrics.heightPixels * 0.85).toInt()
)
// Reference na prvky v popup layoutu
val inviteButton = dialog.findViewById(R.id.invite_user_button)
val userToInvite = dialog.findViewById(R.id.user_to_invite)

//akce pri kliknuti na tlacitka invite
inviteButton.setOnClickListener {
val emailOfUser = userToInvite.text.toString().trim()

findUserByEmail(emailOfUser) { uid ->
if (uid != null) {
sendInvite(uid)
} else {
Toast.makeText(
this,
"User not found",
Toast.LENGTH_SHORT
).show()
}
dialog.dismiss()
}
}
dialog.show()
}
также вот моя структура моей базы данных реального времени в формате JSON:

Код: Выделить всё

{
"companies": {
"-OF8g0gzObjssaWcykla": {
"name": "test",
"users": {
"6DsKz7vXhba67GyVUkRB6br4np72": {
"status": "online"
}
}
},
"-OFCg1E5gxhNFRY-v2YR": {
"name": "test2",
"users": {
"1oBt5qUusXcJd8Wvzf6JAZRcecx2": {
"status": "offline"
}
}
}
},
"users": {
"6DsKz7vXhba67GyVUkRB6br4np72": {
"companies": {
"-OF8g0gzObjssaWcykla": {
"Authorization": "manager",
"companyName": "test"
}
},
"email": "test@gmail.com",
"username": "Aloegarden"
},
"srFA1euZPXfjQMUvwTQFA31MsVE3": {
"email": "test2@gmail.com",
"username": "misa"
}
}
}
Я хочу, чтобы он обновлял подтаблицы пользователя и рядом с «электронной почтой» и «именем пользователя» создавал подтаблицу «приглашения» с подтаблицей «от», которая содержит идентификатор компании, отправившей сообщение. приглашать. А так это должно выглядеть так:

Код: Выделить всё

"users": {
"srFA1euZPXfjQMUvwTQFA31MsVE3": {
"email": "test2@gmail.com",
"username": "misa",
"invites": {
"from": "-OF8g0gzObjssaWcykla"
}
}
}
С моей точки зрения код выглядит нормально, но, возможно, это связано с тем, как я вызываю функции. Кроме того, переменная CompanyID определена правильно, потому что я также использую ее в том же действии для других запросов, и она работает
Я пробовал разные методы обновления базы данных, например, вместо setValues(), который я использовал толкать(). Что действительно странно, так это то, что у меня есть похожие запросы в других частях кода, которые работают нормально и скопировали точный метод обновления, но в данном случае он не работает. Я вызываю этот метод в другом методе, который используется в диалоговом окне, так что, возможно, это связано с этим. Также всплывающее сообщение «Приглашение отправлено!» отображается, поэтому мне очень сложно найти ошибку.

Подробнее здесь: https://stackoverflow.com/questions/793 ... fter-query
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»