【发布时间】:2021-03-02 23:25:42
【问题描述】:
我正在开发一个带有Firebase Realtime Database 设施的颤振应用程序。这是一种聊天应用程序。这里我有一个名为chat_room 的根节点,它将保存所有聊天室。每个chat_room 都将保存有关其成员的信息,即聊天中的人。下面是我现在的数据结构
我的要求是,当我通过电子邮件搜索时,我应该能够获得与该电子邮件关联的所有 chat_rooms。例如,我需要知道电子邮件 ID someone@test.com 注册的所有chat_rooms。
问题是,我现在知道我不能用我当前的结构来做到这一点,我将数据保存为array。阅读this 我知道使用SET 是Array 的更好替代品,因为它允许我们执行此类搜索。所以也许这就是我需要的结构。
chat_room
chatroom1
chat_mode: "supplier",
last_message: "test",
timestamp: 1223334
members:
email1: true
email2: true
chatroom2
chat_mode: "supplier",
last_message: "test",
timestamp: 1223334
members:
email1: true
email2: true
下面是我用来通过电子邮件搜索的代码,它什么也没给我。
final DatabaseReference reference = FirebaseDatabase.instance.reference().child('chat_room');
reference.orderByChild("members").equalTo("someone@test.com").once();
目前,这是我将数据保存到 chat_room 的方式。
//Create chat_room
Future<String> createChatRoom({String lastMessage, String chatMode, List<ChatMember> members}) async {
var newChatRoomRef = _chatRoomReference.push();
var newChatRoomKey = newChatRoomRef.key;
await newChatRoomRef.set({
'last_message': lastMessage,
'chat_mode': chatMode,
'members': [members[0].email, members[1].email],
'timestamp': DateTime.now().millisecondsSinceEpoch,
});
return newChatRoomKey;
}
无论是SET数据结构还是Array或者HashMap或者不管是什么,我的要求是通过电子邮件搜索chat_rooms。
- 如果
SET数据结构是这个问题的答案,我怎样才能将它保存到firebase?如何准备数据以便正确发送?请随时使用我上面的createChatRoom方法,并告诉我如何通过SET而不是Array。 - 如何执行搜索?
- 如果
set不是答案,那是什么?
感谢您的支持。
编辑
根据@Frank 的建议,我这样写了我的代码,复制了他提供的确切代码。
//Create chat_room
Future<String> createChatRoom(
{String lastMessage, String chatMode, List<ChatMember> members}) async {
var newChatRoomRef = _chatRoomReference.push();
var newChatRoomKey = newChatRoomRef.key;
await newChatRoomRef.set({
'last_message': lastMessage,
'chat_mode': chatMode,
'members': [members[0].email, members[1].email],
'timestamp': DateTime.now().millisecondsSinceEpoch,
});
var userChatRoomsRef =
FirebaseDatabase.instance.reference().child('chat_room');
members.forEach((member) {
userChatRoomsRef
.child(member.userID.toString() + "-userID")
.child(newChatRoomKey)
.set(true);
});
return newChatRoomKey;
}
那个,这是它生成的结构。 (请注意,30-userID 和 50-userID 是实际的用户 ID,因为我没有使用 Firebase Auth 的 UID)
无论如何,我真的不确定这是否是我应该拥有的正确结构。
编辑 2
根据@Frank 的编辑,这就是我制作我的代码和它生成的数据库结构的方式。
//Create chat_room
Future<String> createChatRoom(
{String lastMessage, String chatMode, List<ChatMember> members}) async {
var newChatRoomRef = _chatRoomReference.push();
var newChatRoomKey = newChatRoomRef.key;
await newChatRoomRef.set({
'last_message': lastMessage,
'chat_mode': chatMode,
'members': [members[0].email, members[1].email],
'timestamp': DateTime.now().millisecondsSinceEpoch,
});
var userChatRoomsRef =
FirebaseDatabase.instance.reference().child('user_chatrooms');
members.forEach((member) {
userChatRoomsRef
.child(member.userID.toString() + "-userID")
.child(newChatRoomKey)
.set(true);
});
return newChatRoomKey;
}
现在仍然确定这是否是正确的,因为我现在正在转移到另一个节点。
【问题讨论】:
标签: android ios firebase flutter firebase-realtime-database