【问题标题】:Updating an item inside an array on Firebase Flutter在 Firebase Flutter 上更新数组中的项目
【发布时间】:2020-08-23 05:10:06
【问题描述】:

我制作了一个聊天应用程序,我希望用户能够将聊天室标记为收藏或将聊天室静音。

我的数据库结构如下图所示

我想要的是当用户尝试将聊天室静音或将其标记为收藏时, 我只更新与 chatroomId 匹配的项目,但经过大量搜索,我发现 Firebase 不允许您更新数组的元素,您只能从数组中添加或删除。

这是我将聊天室静音或标记为收藏的功能:

static final Firestore dbReference = Firestore.instance;

static Future<void> currentUserChatroomChangeMuteOrFavouriteMethod({
    @required String chatroomId,
    @required bool muteValue,
    @required bool favouriteValue,
    @required ChatroomMuteFavouriteOption operationToBeDone,
  }) async {

 DocumentReference docRef = dbReference
        .collection("user_chatrooms")
        .document(CurrentUserDetails.id);

    DocumentSnapshot docSnapshot = await docRef.get();
    Map<String, dynamic> docData = docSnapshot.data;

    List<Map<String, dynamic>> userChatrooms =
        (docData["chatrooms"] as List<dynamic>)
            .map((chatroom) => Map<String, dynamic>.from(chatroom))
            .toList();

    for (int index = 0; index < userChatrooms.length; index++) {
      Map<String, dynamic> chatroom = userChatrooms[index];
      if (chatroom["chatroomId"] == chatroomId) {
        if (operationToBeDone == ChatroomMuteFavouriteOption.muteOperation) {
          chatroom["isMuted"] = !muteValue;
        } else {
          chatroom["isMarkedFavourite"] = !favouriteValue;
        }

        break;
      }
    }

    await docRef.updateData({"chatrooms": userChatrooms});
 }

所以基本上我得到了所有的数据,我更新了我想要的字段,我再次更新了数据,但这不是一个好的解决方案,因为我也得到了我不需要的聊天室。

我怎样才能有效地执行此操作?

谢谢。

【问题讨论】:

    标签: firebase flutter google-cloud-firestore


    【解决方案1】:

    这是一个完美的解决方案。为了更新数组的内容,您必须读取文档,修改内存中的数组,然后使用新数组更新文档。除了将您的数组转换为子集合中的文档之外,实际上没有其他方法可以提高效率。

    【讨论】:

    • 我认为这可能是一个糟糕的解决方案的原因是,如果用户有 100 个聊天室,例如,获取和更新所有数组以更改项目的字段看起来效率不高在我看来。
    • 我不认为你有其他选择,除了我提到的。
    • 太好了,谢谢你的回答!
    • 我的是一个实时视频通话应用。我决定将所有活跃用户放在一个数组中。为了避免高昂的火力费用(每个文档读取的成本)。因此,当一个用户更新数组而另一个用户拉取同一个数组时,可能会导致一些用户丢失一些细节。任何有解决方案的人。(我可以使用更好的方法)
    猜你喜欢
    • 2019-07-11
    • 2021-06-29
    • 2021-07-06
    • 2020-09-11
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多