#firebase #flutter #google-cloud-firestore
# #firebase #flutter #google-облако-firestore
Вопрос:
Я сохраняю документы в firestore, используя datetime в качестве их идентификатора, но если я сохранил более одного за одну минуту, он удаляет старый и заменяет его новым «в ту же минуту». Я проверяю дату и время в flutter, у него есть секунды и миллисекунды, но в firestore это всего лишь минуты и секунды а миллисекунды устанавливаются равными 00:000
значение 2020-12-04 13:51:03.836035 в flutter превращается в 2020-12-04 13:51:00.000 в firestore
как я могу решить эту проблему?
Я использую
users
.doc(auth.currentUser.uid)
.collection('documents')
.doc(dateTime.toString())
.set({
'day': DateTime.parse(dateTime.toString().substring(0, 10)),
'document': {
dateTime.toString(): {'documentContent': content.text, 'documentDateTime': dateTime}
}
}, SetOptions(merge: true))
.then((value) => print("Document Added"))
.catchError((error) => print("Failed to add Document: $error"));
DateTime — это объект DateTime, кстати
Я говорю об этой части «documentDateTime»: DateTime или DateTime.toString()
Комментарии:
1. Похоже, что ваш .substring(0, 10) урезает время от даты? Если вы удалите это, это что-нибудь изменит?
2. Я вижу это, но я говорю об этой части «documentDateTime»: DateTime или DateTime.toString()
3. Ах, моя ошибка. Итак, что происходит, когда вы отлаживаете и получаете значение document (
dateTime.toString()
)
Ответ №1:
Я использовал код, которым вы поделились, для создания документа, а затем загрузил документы обратно в приложение Flutter и распечатал его содержимое, и вот что я получаю:
// Add code right below your snippet
users
.doc(auth.currentUser.uid)
.collection('documents')
.doc(dateTime.toString())
.get()
.then((doc) => print(doc.data()));
// Output:
{document:
{2020-12-18 13:49:58.496955:
{documentContent: xx,
documentDateTime: Timestamp(seconds=1608299398, nanoseconds=496000000)}},
day: Timestamp(seconds=1608249600, nanoseconds=0)}
Действительно, в поле documentDateTime
есть данные за миллисекунды. Происходит то, что пользовательский интерфейс консоли Firestore не отображает данные за миллисекунды, даже если данные есть.
Ответ №2:
Я настоятельно рекомендую не использовать строки даты в качестве идентификаторов документов. это вызывает у вас проблемы сегодня и будет продолжать вызывать у вас проблемы в будущем.
Вместо этого сохраните время в документе в виде поля (в любом удобном для вас формате) и используйте это поле для запроса и упорядочивания документов. При создании документа вы можете использовать случайный идентификатор документа, предоставленный add()
.
Если вам нужно что-то обновить в этом документе, вы можете использовать поля документа, чтобы найти его с помощью запроса, а затем обновить документ после его нахождения. Вам решать, как лучше всего сохранить время, чтобы вы могли снова найти документ. Это то, что вам нужно будет тщательно продумать.
Комментарии:
1. спасибо за совет, но у меня уже есть поле в документе для объекта DateTime, но секунды не регистрируются только 00:000, как я могу это решить?
2. Вы удалили их с помощью substring(0,10). Если вы этого не хотите, то удалите этот код. Вам нужно будет точно определить, что вы хотите сохранить, а затем убедиться, что ваш код соответствует этому. Если вам нужна помощь в этом здесь, вам следует отредактировать вопрос, чтобы более подробно объяснить, что работает не так, как вы ожидаете, показывая конкретные примеры.