Обновление элемента внутри массива на Firebase Flutter - PullRequest
0 голосов
/ 07 мая 2020

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

Структура моей базы данных похожа на изображение ниже

Я хочу, чтобы пользователь пытался отключить звук в чате или пометить его как избранное, я обновляю только элемент, соответствующий 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});
 }

Итак, я получаю все данные, обновляю нужное поле и снова обновляю данные, но это не хорошее решение, поскольку я также получаю чаты, которые мне не нужны.

Как я могу эффективно выполнить эту операцию?

Спасибо.

1 Ответ

1 голос
/ 07 мая 2020

Это прекрасное решение. Чтобы обновить содержимое массива, вам нужно прочитать документ, изменить массив в памяти, а затем обновить документ новым массивом. На самом деле нет никакого способа сделать это более эффективным, кроме как преобразовать ваш массив в документы в подколлекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...