Как мне запросить несколько документов в Flutter Firebase, где идентификатор равен идентификатору текущего пользователя? — Flutter Firebase

#firebase #flutter #google-cloud-firestore #flutter-dependencies #provider

#firebase #flutter #google-cloud-firestore #flutter-зависимости #поставщик

Вопрос:

У меня есть экран просмотра, на котором я хочу отобразить всех клиентов. Клиенты отображаются в формате списка.

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

   getCustomers(CustomerNotifier customerNotifier) async {
    String userId = (await FirebaseAuth.instance.currentUser()).uid;

    print('Current logged in user uid is: $userId');

    QuerySnapshot snapshot = await Firestore.instance
        .collection('customers')
        .where("id", isEqualTo: userId)
        .orderBy('created_at', descending: true)
        .getDocuments();

    List<Customer> _customerList = [];

    snapshot.documents.forEach((document) {
      Customer customer = Customer.fromMap(document.data);
      _customerList.add(customer);
    });

    customerNotifier.customerList = _customerList;
  }    

  Future createOrUpdateCustomer(Customer customer, bool isUpdating) async {
    CollectionReference customerRef =
        await Firestore.instance.collection('customer');
    FirebaseUser user = await FirebaseAuth.instance.currentUser();
    String userId = user.uid;
    print('Current logged in user uid is: $userId');

    if (isUpdating) {
      customer.updatedAt = Timestamp.now();
      await customerRef.document(userId).updateData(customer.toMap());
      print('updated customer with id: ${customer.id}');
    } else {
      customer.createdAt = Timestamp.now();

      DocumentReference documentReference = await customerRef.document(userId);
      // add(customer.toMap());

      customer.id = documentReference.documentID;

      print('created customer successfully with id: ${customer.id}');

      await documentReference.setData(customer.toMap(), merge: true);
      addCustomer(customer);
    }
    notifyListeners();
  }    
  

Я могу успешно выполнить запись в базу данных. Однако чтение всех документов клиента и отображение клиентов, созданных CurrentUser (где идентификатор документа == uid текущего пользователя), не отображается в моем представлении списка клиентов.

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

Спасибо.

Пожалуйста, обратите внимание, что мои версии зависимостей проекта flutter указаны ниже:

   firebase_core: ^0.4.5
  firebase_auth: ^0.16.1
  cloud_firestore: ^0.13.7
  provider: ^4.3.1
  firebase_storage: ^3.1.0
  

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

1. Является id ли in where ссылкой на documentId или поле в документе с именем id?

2. Да, это так. Я отредактировал основной вопрос, чтобы включить скриншот моей firebase. он называется id.

3. Я также добавил свой класс модели клиента.

Ответ №1:

Ваша коллекция — «клиент», а не «клиенты» измените свой запрос на:

 QuerySnapshot snapshot = await Firestore.instance
    .collection('customer')
    .where("id", isEqualTo: userId)
    .orderBy('created_at', descending: true)
    .getDocuments();
  

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

1. Хороший улов! изменен на customer и now. Он показывает только недавно созданного клиента. Не все это создано текущим пользователем.

2. Проверьте все свои данные должным образом, возможно, вы создали предыдущие данные с другим идентификатором пользователя.

3. Вероятно, я должен. Он попросил меня создать составной индекс на облачной платформе Google, что я и сделал. Интересно, нормально ли это, поскольку я больше нигде этого не видел и раньше меня об этом не просили.

4. Я, наконец, понял, почему он отображает только последний созданный документ. Это связано с тем, что все документы создаются с одним и тем же идентификатором. Какова альтернатива этому? В первую очередь я думаю разрешить автоматическую генерацию идентификатора документа, пока я создаю поле с именем user_id в каждом документе и устанавливаю user_id в качестве идентификатора CurrentUser()? Есть ли еще один способ взломать это?

5. Составные индексы очень удобны для запросов firestore, они предназначены для индексации ваших данных для более быстрых и эффективных запросов. Для вашего второго комментария вы должны разрешить автоматическую генерацию идентификаторов документов, как вы предложили, и создать поле «id», чтобы ваше предложение «where» для запроса firestore работало.