# #flutter #google-cloud-firestore
Вопрос:
У меня есть массив внутри документа Firestore. В массиве хранится список карт.
Итак, я хочу обновить данные по определенному индексу, но Firestore не разрешает обновление индекса. Поэтому мне пришлось извлечь весь массив и обновить данные по объектам, а затем загрузить массив обратно в Firestore. Однако я продолжаю получать эту ошибку, в которой говорится:» Недопустимый аргумент: экземпляр «Оценить..» Массив находится в списке объекта оценки.
class Evaluate {
String sb;
double mk;
Evaluate({this.sb, this.mk});
}
class EvaluateList {
List<dynamic> evaluateList = [];
EvaluateList({this.evaluateList});
}
Я зашел в тупик, потому что я не знаю, как загрузить его сейчас, так как он есть на карте, и я все перепробовал. Я на самом деле не практикую карту, потому что это для меня в новинку, но мне пришлось применить карту для этих данных, потому что это единственный метод, и теперь у меня не хватает времени на попытки и ошибки. Итак, кто-нибудь может помочь мне решить эту проблему? Заранее спасибо 🙂
Вот моя функция Firestore:
Future getEvData(String sEv, double nEv) async {
//manage document snapshot
DocumentSnapshot evSnapshot = await evCollection.document(uid).get();
var evMap = evSnapshot.data['evaluate'];
List<Evaluate> dataEv = extractEvaluation(evMap);
// calculation for new data
double oldEv;
int index = 0;
int evIndex;
dataEv.forEach((e) {
if (e.sb == sEv) {
oldEv = e.mk;
evIndex = index;
}
index ;
});
double newEv = (oldEv nEv) / 2;
double percentEv = newEv / 5 * 100;
dataEv[evIndex].mk = percentEv;
// update to firestore
return await evCollection.document(uid).updateData({
"evaluate": dataEv,
});
}
Если вы найдете лучший способ структурировать мою базу данных и более простой способ запросов, вы можете предложить, потому что я все еще учусь..
Ответ №1:
Я собираюсь игнорировать класс модели Evaluate
здесь, потому что он избыточен. Так dataEv
и есть List<Map<String, dynamic>>
. Сначала вам нужно удалить точный элемент из списка. С помощью removeAt
dataEv.dataEv.removeAt(index);
или использовать removeWhere
, когда ‘mk 30
dataEv.removeWhere((item) => item['mk'] == 30);
и когда » sb «- это «химия»
dataEv.removeWhere((item) => item['sb'] == 'chemistry');
Затем вы должны добавить новый элемент в список. Например, если вы хотите обновить » mk «химии» sb » с 30 до 50. Тебе это нравится.
dataEv.add({'mk': 50, 'sb': 'chemistry'});
если вы хотите обновить «sb», вы меняете значение » sb » следующим образом
dataEv.add({'mk': 30, 'sb': 'physics'});
Однако, если вы хотите обновить элемент с тем же индексом, вам необходимо сначала сохранить индекс удаленного элемента с помощью indexOf
или indexWhere
затем использовать этот индекс для обновления списка с помощью insert
. Но я думаю, что тебе не нужно этого делать. Так как вы можете легко sort
составить список.
наконец, обновитесь dataEv
до firestore.
Комментарии:
1. Большое вам спасибо за ответ. Я очень благодарен вам за то, что вы потратили свое время на изучение моего кода. Я получил ошибку при удалении, так как мой список имеет фиксированную длину. Однако ваша идея сначала удалить, а затем добавить новые данные действительно полезна, потому что я могу это сделать. Поэтому вместо этого я удаляю конкретную карту из массива с помощью arrayRemove. Вместо обновления всего массива я добавляю новые обновленные данные, которые я удалил ранее. Еще раз спасибо вам 🙂
2. Это оффтопик, но я думаю, что это хорошая практика, чтобы назвать вашу переменную удобочитаемой, чтобы устранить путаницу. Вместо названия mk, sb, Ev, затем как отметки, тема, оценка. Какую ошибку вы получаете при использовании
removeWhere
? Не имеет значения, исправлена ли она.3. ха-ха, я бы так и сделал. Переменные еще не были доработаны, и у меня вошло в привычку тестировать код с небольшими данными, а также с помощью простой переменной, чтобы было легко обнаружить ошибку и внести изменения. Но спасибо за совет 🙂