Как изменить пару ключей в документе в Cloud Firestore?

# #firebase #flutter #google-cloud-firestore #flutter-test

Вопрос:

Я хочу отредактировать следующую пару ключей в Cloud Firestore: введите описание изображения здесь

Для этого я создал кнопку, которая вызывает следующую функцию:

 void select(key) {
    if (key == 'Stufe 1') {
      stufenService.editStufe('Stufe', 1);
    }
    if (key == 'Stufe 2') {
      stufenService.editStufe('Stufe', 2);
    }
    if (key == 'Stufe 3') {
      stufenService.editStufe('Stufe', 3);
    }
    if (key == 'Stufe 4') {
      stufenService.editStufe('Stufe', 4);
    }
    if (key == 'Stufe 5') {
      stufenService.editStufe('Stufe', 5);
    }
    if (key == 'Stufe 6') {
      stufenService.editStufe('Stufe', 6);
    } print(key);
  }
 

Это точный код stufenService.editStufe(строка, int):

 final CollectionReference userTodos =

FirebaseFirestore.instance.collection('userTodos');
  
  Future editStufe(String Stufe, int i) async{
    return await userTodos.doc(userID).update({Stufe: i});
  }
}
 

Когда я нажимаю кнопку с вызовом «выбрать», в консоли печатается только клавиша.
В Cloud Firestore ничего не меняется.
Я думаю, что ошибка где-то здесь:

 final CollectionReference userTodos =

FirebaseFirestore.instance.collection('userTodos');

  Future editStufe(String Stufe, int i) async{
    return await userTodos.doc(userID).update({Stufe: i});
  }
}
 

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

Ответ №1:

Просматривая Google и внешнюю документацию, вы можете использовать следующий пример кода для обновления пары ключей на Cloud Firestore :

Это пример кода того, как обновить пару ключей с помощью ‘ update :

 const usuariosRef = db.collection(‘userTodos’);

//userTodosRef.doc(‘ID’)

userTodosRef
    .doc(‘81Acc0wgLegYMSTTrCWLRQhzjA2’)
    .update({
          stufe = 1
    });


This is an example code of how to update your key pair using ‘`set`’:

const usuariosRef = db.collection(‘userTodos’);

//userTodosRef.doc(‘ID’)

userTodosRef
    .doc(‘81Acc0wgLegYMSTTrCWLRQhzjA2’)
    .set({
          stufe = 1
    });
 

Разница между ними заключается в том, что «обновить» изменяет только значение, которое вы хотите обновить, «установить» удаляет все данные и обновляет их с добавленной стоимостью.

Вот документ, который может помочь вам с рекомендациями, которые вы можете выполнить с вашими данными: https://googleapis.dev/nodejs/firestore/latest/DocumentReference.html#update

Комментарии:

1. Спасибо вам за ваш ответ! Я просто не понимаю часть вашего объяснения: const usuariosRef = db.collection(‘userTodos’); Вы больше не используете usuarioRef. И должен ли я использовать: FirebaseFirestore.instance.collection('userTodos'); вместо этого? база данных не инициализируется в моем коде.

2. Кроме того, stufe = 1 подчеркнуто красным цветом. Ошибка: The argument type 'Set<int>' can't be assigned to the parameter type 'Map<String, Object?>'.

3. Вызов набора с идентификатором, который уже существует в коллекции, заменит все данные документа. Вы также можете указать параметр SetOption(merge: true)) в запросе и объединить существующий документ с данными, переданными в набор( ) CollectionReference users = FirebaseFirestore.instance.collection('users'); Future<void> addUser() { return users // existing document in 'users' collection: "ABC123" .doc('ABC123') .set({ 'full_name': "Mary Jane", 'age': 18 }, SetOptions(merge: true),

4. Если вы хотите обновить документ вместо этого, используйте набор методов обновления CollectionReference users = FirebaseFirestore.instance.collection('users'); Future<void> updateUser() { return users .doc('ABC123') .update({'company': 'Stokes and Sons'}) .then((value) => print("User Updated")) .catchError((error) => print("Failed to update user: $error")); } и примеры обновления, вы можете отредактировать свой код, не забудьте обновить идентификатор .doc с идентификатором: 81Acc0wgLegYMSTTrCWLRQhzjA2

5. На первый взгляд кажется, что это работает. Я создаю следующее будущее в «StufenService»: Future<void> updateUser(String text, int i){ return users .doc('8lAcc0wgLegYMST5TrCWLRQhzjA2') .update({text : i}) .then((value) => print("User Updated")) .catchError((error) => print("Failed to update user: $error"));} И для функции кнопки я использовал этот код: void select(key){ if (key == 'Stufe 1') { stufenService.updateUser('Stufe', 1); } Консоль также выводит Обновленные данные пользователя. Но документ в firebase остается в «Stufe»: 0