Невозможно записать в несколько мест с помощью облачного хранилища - PullRequest
0 голосов
/ 26 апреля 2018

Я хочу записать в 2 местоположения в Firebase: «Опросы» и «Тенденции».

Я сделал это успешно, однако я заметил, что моя первая запись выделяется курсивом из определенного «ключа», который я добавили не перечисляя никакие поля, тогда как вторая запись действительно показывает все связанные поля.Почему это так и считается ли это лучшей практикой?Я удивлен тем, что один и тот же ключ был создан с тех пор, как я вызвал .add() в двух отдельных методах.

            //write to Firebase Cloud Firestore
            mStoreBaseRef.collection("Polls").add(pollMap).addOnCompleteListener(new OnCompleteListener<DocumentReference>() {
                @Override
                public void onComplete(@NonNull Task<DocumentReference> task) {
                    if (task.isSuccessful()) {
                        DocumentReference docRef = task.getResult();
                        String key = docRef.getId();
                        Log.v("KEY", key);
                        Toast.makeText(getApplicationContext(), key, Toast.LENGTH_LONG).show();
                        CollectionReference pollAnswerRef = mStoreBaseRef.collection("Polls").document(key).collection("answers");
                        //TODO: need to add answers
                        for (int i = 0; i < mPollAnswers.size(); i++){
                            pollAnswerRef.document(String.valueOf(i + 1)).set((poll.answerConvert(mPollAnswers, i)), SetOptions.merge());
                        }
                    }
                }
            });

            //TODO: write to multiple locations in Firebase; check this location for epoch > 24 hours dated and delete with Cloud Functions
            mStoreBaseRef.collection("Trending").add(pollMap).addOnCompleteListener(new OnCompleteListener<DocumentReference>() {
                @Override
                public void onComplete(@NonNull Task<DocumentReference> task) {
                    if (task.isSuccessful()) {
                        DocumentReference docRef = task.getResult();
                        String key = docRef.getId();
                        Log.v("KEY", key);
                        Toast.makeText(getApplicationContext(), key, Toast.LENGTH_LONG).show();
                        CollectionReference pollAnswerRef = mStoreBaseRef.collection("Polls").document(key).collection("answers");
                        //TODO: need to add answers
                        for (int i = 0; i < mPollAnswers.size(); i++){
                            pollAnswerRef.document(String.valueOf(i + 1)).set((poll.answerConvert(mPollAnswers, i)), SetOptions.merge());
                        }
                    }
                }
            });

enter image description here enter image description here

1 Ответ

0 голосов
/ 26 апреля 2018

Это происходит потому, что при использовании следующей строки кода:

mStoreBaseRef.collection("Polls").add(pollMap).addOnCompleteListener(/* ... */)

Вы пишете коллекцию pollMap внутри Polls, что является правильным.Затем в методе onComplete() вы используете следующую строку кода:

String key = docRef.getId();

, которая будет возвращать точный идентификатор, который был сгенерирован, когда вы написали выше pollMap в базу данных.Таким образом, передача этого ключа в качестве аргумента методу document() внутри следующей строки кода:

CollectionReference pollAnswerRef = mStoreBaseRef.collection("Polls").document(key).collection("answers");

Означает, что вы переопределяете все данные в следующем местоположении:

Firestore-root
    |
    --- Pools (collection)
          |
          --- d7kjSLqvM1qyS5t07Jxx (document)

Таким образом, все в этом месте будет удалено, и новые данные будут добавлены.Это происходит в случае Map, оно заменяет старое значение новым.Как видно из вашего первого снимка экрана, под этим местоположением не осталось ничего, кроме новой коллекции answers, которая была только что добавлена.Чтобы решить эту проблему, вам нужно использовать метод update() вместо метода set().

Что касается второй записи, вы добавляете тот же pollMap, но на этот раз в коллекцию Trending и какна втором снимке экрана все работает нормально, потому что вы не используете другие операции записи по той же ссылке , но , используя снова следующую строку кода:

String key = docRef.getId();

Создается новый идентификатори используя его в следующей строке кода:

CollectionReference pollAnswerRef = mStoreBaseRef.collection("Polls").document(key).collection("answers");

В результате будут созданы новые данные по той же ссылке, что и при первой записи.Видите ли, вы используете ту же коллекцию Polls?Это, скорее всего, причина, по которой у вас больше документов в первой коллекции, чем во второй.

Что касается одного и того же идентификатора, я несколько раз тестировал тот же код, что и ваш, или метод document() безпередавая любые аргументы и каждый раз генерируются разные идентификаторы.Я думаю, что вы каким-то образом вручную создали операцию записи с этим идентификатором.

В заключение, установите правильные ссылки в вашем коде, удалите данные, которые у вас уже есть в вашей базе данных, и добавьте свежие, это должно решить вашу проблему.проблема.

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