Облачный FireStore несколько документов с одинаковым идентификатором, который является UID пользователя

#firebase #flutter #dart #google-cloud-firestore

#firebase #флаттер #dart #google-cloud-firestore

Вопрос:

Мне было интересно, как я могу отобразить более одного документа, связанного с одним и тем же ПОЛЬЗОВАТЕЛЬСКИМ UID

введите описание изображения здесь

На данный момент мое приложение отображает только один документ PDF

введите описание изображения здесь

что я могу сделать, чтобы отобразить более одного документа одного и того же пользователя??? Я не понимаю, как должна работать эта логика, возможно ли это сделать без SQL?

Я знаю только, как получить один документ, используя пользовательский идентификатор.

мой код:

 class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
    FirebaseFirestore firestore = FirebaseFirestore.instance;
    FirebaseAuth auth = FirebaseAuth.instance;

    int _currentIndex = 0;

    @override
    Widget build(BuildContext context) {
      final User user = auth.currentUser;
      final uid = user.uid;



      final tabs = [
        Center(

            child: (Scaffold(
                body: FutureBuilder(
                    future: FirebaseFirestore.instance
                        .collection('users')
                        .doc(uid)
                        .get(),
                    builder: (context, AsyncSnapshot snapshot) {
                      if (snapshot.data == null)
                        return CircularProgressIndicator();

                      DocumentSnapshot manuais = snapshot.data;

                      if (snapshot.hasData) {
                        print('ok');
                        print(manuais.data()['nome']);
                      } else {
                        print('nopeeeee');
                      }
                      return Container(
                        padding: EdgeInsets.all(16),
                        child: ListView.builder(
                            itemCount : 1,
                            itemBuilder: (context, index) {



                              DocumentSnapshot manuais = snapshot.data;


                              return Card(
                                color: Colors.grey[250],
                                child: Container(
                                  padding: EdgeInsets.all(10),
                                  child: Column(
                                    crossAxisAlignment:
                                        CrossAxisAlignment.start,
                                    children: <Widget>[
                                      new Image.asset(
                                        'Images/pdflogo.png',
                                        width: 32,
                                      ),
                                      Center(
                                        child: Text(
                                          (manuais.data()['nome'].toString()),
                                          maxLines: 1,
                                          overflow: TextOverflow.ellipsis,
                                          style: TextStyle(fontSize: 16),
                                        ),
                                      ),
                                      ButtonBar(
                                        children: <Widget>[
                                          FlatButton(
                                              child: const Text(
                                                  'Compartilhar / Download'),
                                              onPressed: () async {
                                                var request = await HttpClient()
                                                    .getUrl(Uri.parse(manuais
                                                        .data()['documento']));
                                                var response =
                                                    await request.close();
                                                Uint8List bytes =
                                                    await consolidateHttpClientResponseBytes(
                                                        response);
                                                await Share.file(
                                                    'ESYS AMLOG',
                                                    'Manual.pdf',
                                                    bytes,
                                                    'image/jpg');
                                              }),
                                        ],
                                      ),
                                    ],
                                  ),
                                ),
                              );
                            }),
                      );
                    })))),
  

Ответ №1:

У вас не может быть нескольких документов с одинаковым идентификатором в одной коллекции: идентификатор документа должен быть уникальным для всей коллекции.

В вашем случае, если я правильно понимаю, у вас может быть вложенная коллекция для каждого user документа, например

 -- users (collection)
   -- DTB2.... (user document)
      -- pdfDocs (subcollection)
         -- JH8766ng.... (pdf document, with auto-generated ID)
            fields: nome: "PDF1", creationDate: ..., author: .... (for example)
         -- 65rt6b8H.... (pdf document, with auto-generated ID)
            fields: nome: "PDF2", creationDate: ..., author: .... 
  

Вы бы запросили все документы с:

  FirebaseFirestore.instance
       .collection('users')
       .doc(uid)
       .collection('pdfDocs')
       .get();
  

который возвращает a QuerySnapshot .

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

1. большое вам спасибо, поэтому, используя вложенную коллекцию, я могу отображать более одного документа для каждого пользователя.

2. Я изменил FirebaseFirestore.instance как вы показали, теперь я получаю тип ‘QuerySnapshot’ не является подтипом типа ‘DocumentSnapshot’ знаете, что еще мне нужно изменить, чтобы отобразить вложенную коллекцию?

3. Взгляните на документ: firebase.flutter.dev/docs/firestore/usage#одноразовое чтение

4. Круто, рад, что смог помочь!