我正在使用 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()
)
您的
conversations
节点被建模为 List
/数组,这是使用 Firebase 实时数据库时常见的(且有详细记录的)反模式。我建议阅读最佳实践:Firebase 中的数组,以及有关如何在列表中读取和写入数据的文档。
切换到此推荐结构后,您可以通过调用
push()
添加新对话,并根据知道其按键来更新任何现有对话。如果您此时遇到问题,请发布一个新的问题来显示您尝试过的操作。