Flutter Firestore - Проверьте, существует ли уже идентификатор документа - PullRequest
1 голос
/ 06 мая 2019

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

// varuId == the ID that is set to the document when created


var firestore = Firestore.instance;

if (firestore.collection("posts").document().documentID == varuId) {
                      return AlertDialog(
                        content: Text("Object already exist"),
                        actions: <Widget>[
                          FlatButton(
                            child: Text("OK"),
                            onPressed: () {}
                          )
                        ],
                      );
                    } else {
                      Navigator.of(context).pop();
                      //Adds data to the function creating the document
                      crudObj.addData({ 
                        'Vara': this.vara,
                        'Utgångsdatum': this.bastFore,
                      }, this.varuId).catchError((e) {
                        print(e);
                      });
                    }

Цель состоит в том, чтобы проверить все идентификаторы документов в базе данных и проверить наличие совпадений с переменной «varuId». Если он совпадает, документ не будет создан. Если он не совпадает, он должен создать новый документ

Ответы [ 2 ]

0 голосов
/ 05 июня 2019

Можно get() документ и использовать свойство exists в снимке, чтобы проверить, существует ли документ.

Пример:

final snapShot = Firestore.instance
  .collection('posts')
  .document(docId)
  .get()

if (snapShot == null || !snapShot.exists) {
  // Document with id == docId doesn't exist.
}
0 голосов
/ 06 мая 2019
  QuerySnapshot qs = await Firestore.instance.collection('posts').getDocuments();
  qs.documents.forEach((DocumentSnapshot snap) {
    snap.documentID == varuId;
  });

getDocuments () выбирает документы для этого запроса, вам нужно использовать его вместо document (), который возвращает DocumentReference с указанным путем.

Запрос к пожарному депо является асинхронным.Вам нужно дождаться его результата, иначе вы получите Future, в этом примере Future<QuerySnapshot>.Позже я получаю DocumentSnapshot s от List<DocumentSnapshots> (qs.documents), и для каждого снимка я проверяю их documentID с помощью varuId.

Таким образом, выполняются шаги, запрашивая пожарный складДожидайтесь результата, зацикливайтесь на результатах.Возможно, вы можете вызвать setState() для такой переменной, как isIdMatched, а затем использовать это в своем выражении if-else.

Редактировать: @Doug Стивенсон прав, этот метод дорогой, медленный и, вероятно, съедаетбатарея, потому что мы выбираем все документы, чтобы проверить documentId.Возможно, вы можете попробовать это:

  DocumentReference qs =
      Firestore.instance.collection('posts').document(varuId);
  DocumentSnapshot snap = await qs.get();
  print(snap.data == null ? 'notexists' : 'we have this doc')

Причина, по которой я проверяю данные на нуль, заключается в том, что даже если вы помещаете случайные строки в метод document (), он возвращает ссылку на документ с этим идентификатором.

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