如何在 Kotlin for Firebase 实时数据库中通过 userID 在对象内创建列表?

问题描述 投票:0回答:1

我正在使用 Kotlin 和 Firebase 实时数据库开发一个 Android 项目。我想以这样的方式构建我的数据:每个用户都有与其他用户的对话列表。每个对话都包含两个用户之间交换的最新消息。

这是我想要实现的数据结构的示例:

{
  "403": {
    "conversations": [
      {
        "id": "conversation_403_407_2024-05-08_18:31:38",
        "latest_message": {
          "date": "2024-05-08 18:32:43",
          "isRead": false,
          "message": "Jhbhjbhbckskjcbdsljkcnjldsvljdsjlcdskjcvbjkdsbvkjdvjlwvjl"
        },
        "name": "djFbtu315",
        "otherUserId": 407
      }
    ]
  },
  "407": {
    "conversations": [
      {
        "id": "conversation_403_407_2024-05-08_18:31:38",
        "latest_message": {
          "date": "2024-05-08 18:32:43",
          "isRead": true,
          "message": "Jhbhjbhbckskjcbdsljkcnjldsvljdsjlcdskjcvbjkdsbvkjdvjlwvjl"
        },
        "name": "my basic profile",
        "otherUserId": 403
      },
      {
        "id": "conversation_408_407_2024-05-08_19:31:02",
        "latest_message": {
          "date": "2024-05-08 19:31:02",
          "isRead": true,
          "message": "22"
        },
        "name": "Muhammad",
        "otherUserId": 408
      },
      {
        "id": "conversation_507_407_2024-05-08_19:38:47",
        "latest_message": {
          "date": "2024-05-08 19:39:15",
          "isRead": true,
          "message": "22"
        },
        "name": "Manuel Crandall",
        "otherUserId": 507
      }
    ]
  }
}

在添加或更新对话时,我正在努力在 Kotlin 中实现此结构。这是我当前的代码:

fun addUser(userId: String) {
    val usersReference: DatabaseReference = FirebaseDatabase.getInstance().getReference("Users")
    val userDetails = intent.getParcelableExtra<ConnectionDetailDTO>("USER_DETAILS")
    otherUserId = userDetails?.id!!
    currentUserId = currentUser?.id!!

    usersReference.child(userId).get().addOnSuccessListener { snapshot ->
        if (snapshot.exists()) {
            Log.d(TAG, "User already exists with ID: $userId")
        } else {
            val user = hashMapOf(
                "conversations" to listOf<Conversations>()
            )
            usersReference.child(userId).setValue(true)
                .addOnSuccessListener {
                    Log.d(TAG, "User created with ID: $userId")
                }
                .addOnFailureListener { e ->
                    Log.d(TAG, "Error creating user: $e")
                }
        }
    }.addOnFailureListener { e ->
        Log.d(TAG, "Error checking user existence: $e")
    }
}

我的表名称是“Users” 我需要帮助修改此代码以实现所需的数据结构。具体来说,我不确定如何处理将对话添加到用户对象内的列表中,以及如何在对话已存在时更新最新消息。 这是数据类:

data class Conversations(
    val id: String = "",
    val latest_message: LatestMessage = LatestMessage(),
    val name: String = "",
    val otherUserId: Int = 0 
) {
    data class LatestMessage(
        val date: String = "",
        val isRead: Boolean = false,
        val message: String = "" 
    )
}
data class ChatUser(
    val id: Long = 0, // User ID
    val conversations: List<Conversations> = emptyList()
)
android firebase kotlin firebase-realtime-database
1个回答
0
投票

您的

conversations
节点被建模为
List
/数组,这是使用 Firebase 实时数据库时常见的(且有详细记录的)反模式。我建议阅读最佳实践:Firebase 中的数组,以及有关如何在列表中读取和写入数据的文档。

切换到此推荐结构后,您可以通过调用

push()
添加新对话,并根据知道其按键来更新任何现有对话。如果您此时遇到问题,请发布一个新的问题来显示您尝试过的操作

© www.soinside.com 2019 - 2024. All rights reserved.