Как добавить несколько полей в документ в firebase? - PullRequest
1 голос
/ 06 августа 2020

Я хочу сохранить токены устройства какого-либо устройства в ОДНОМ ДОКУМЕНТЕ в РАЗНЫХ ПОЛЯХ.

Вот мой код,


StreamBuilder(
              stream: stream,
              builder: (BuildContext context,
                  AsyncSnapshot<List<DocumentSnapshot>> snapshots) {
                if (snapshots.connectionState == ConnectionState.active &&
                    snapshots.hasData) {
                  return Expanded(
                    child: ListView.builder(
                      scrollDirection: Axis.vertical,
                      shrinkWrap: true,
                      itemCount: snapshots.data.length,
                      itemBuilder: (BuildContext context, int index) {
                        DocumentSnapshot doc = snapshots.data[index];
                        Map location = doc.data;
                        String fieldname = 'f$index';

                        var dtoken = location['deviceToken'];

                       
                         

                          _firestore.collection('deviceTokens').add({
                            fieldname: dtoken,
                          });
                       
                     
              

                       
                        return Text(
                          "xyz",
                        );
                      },
                    ),
                  );
                } else {
                  return Center(child: CircularProgressIndicator());
                }
              },
            ),

Я хочу сохранить несколько токенов устройства в один документ.

Чтобы быть более понятным,

Когда этот код запускается, я хочу, чтобы в моей базе данных был создан ТОЛЬКО ОДИН ДОКУМЕНТ, в котором есть токены устройств в нескольких полях, например,

в одном документе -

f1: «1-й токен устройства»,

f2: «2-й токен устройства»,

fn: «n-й токен устройства»

Но этот код создает множество документов с разными токенами устройств (1 поле на документ).

Пожалуйста, помогите

ОБНОВЛЕННЫЙ КОД

StreamBuilder(
              stream: stream,
              builder: (BuildContext context,
                  AsyncSnapshot<List<DocumentSnapshot>> snapshots) {
                if (snapshots.connectionState == ConnectionState.active &&
                    snapshots.hasData) {
                  return Expanded(
                    child: ListView.builder(
                      scrollDirection: Axis.vertical,
                      shrinkWrap: true,
                      itemCount: snapshots.data.length,
                      itemBuilder: (BuildContext context, int index) {
                        var docid;

                        if (index == 0) {
                         _firestore
                              .collection('devicetokens')
                              .add({}).then((value) => docid = value);
                        }
                        DocumentSnapshot doc = snapshots.data[index];
                        Map location = doc.data;
                        String fieldname = 'f$index';


                        var dtoken = location['deviceToken'];

                        DocumentReference docss =
                            _firestore.collection("devicetokens").document(docid);
                        docss.setData({
                          fieldname: dtoken,
                        });
                        
                       

                       
                        return Text(
                          "xyz",
                        );
                      },
                    ),
                  );
                } else {
                  return Center(child: CircularProgressIndicator());
                }
              },
            ),

1 Ответ

1 голос
/ 06 августа 2020

Замените это:

_firestore.collection('deviceTokens').add({
  fieldname: dtoken,
});

примерно так:

  DocumentReference doc = _firestore.collection(deviceTokens).document();
  doc.setData({
    "f1" : "1st device token",
    "f2" : "2nd device token",
    "fn" :"nth device token",
  });

EDIT : Вот один из способов сделать это. Получить docid синхронно методом .document(). Не используйте .collection.add() для получения docID, поскольку он асинхронный, то есть он будет нулевым до разрешения будущего (пока сервер не вернется с docID). У вас уже должен быть docID для записи в него с помощью setData.

Это должно работать. Или, по крайней мере, поможет вам найти решение.

StreamBuilder(
              stream: stream,
              builder: (BuildContext context,
                  AsyncSnapshot<List<DocumentSnapshot>> snapshots) {
                if (snapshots.connectionState == ConnectionState.active &&
                    snapshots.hasData) {

                    //This gets you a doc ID synchronously
                    DocumentReference docid = _firestore.collection(deviceTokens).document();

                  return Expanded(
                    child: ListView.builder(
                      scrollDirection: Axis.vertical,
                      shrinkWrap: true,
                      itemCount: snapshots.data.length,
                      itemBuilder: (BuildContext context, int index) {
                        

                        DocumentSnapshot doc = snapshots.data[index];
                        Map location = doc.data;
                        String fieldname = 'f$index';


                        var dtoken = location['deviceToken'];    

                        _firestore.collection("devicetokens")
                        .document(docid.documentID)
                        .setData({
                          fieldname: dtoken,
                        });
                        
                       

                       
                        return Text(
                          "xyz",
                        );
                      },
                    ),
                  );
                } else {
                  return Center(child: CircularProgressIndicator());
                }
              },
            ),
...