Как я могу увеличить значение поля subcollection-document-field Firestore? - PullRequest
1 голос
/ 17 марта 2020

Итак, я работаю над приложением Android, и я пытаюсь увеличить значение поля на 1 нажатием кнопки. По сути, у меня есть коллекция пользователей, у каждого из которых есть подколлекция постов, у каждого поста есть поле нумерации c, называемое «кандидаты», которое я использую, чтобы подсчитать, сколько человек подали заявки на работу.

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

Это моя структура базы данных:

Database Structure

public void executeTransaction(int position){
        db.runTransaction(new Transaction.Function<Void>() {
            @Nullable
            @Override
            public Void apply(@NonNull Transaction transaction) throws FirebaseFirestoreException {

                db.collectionGroup("posts").whereEqualTo("title", list.get(position).getTheTitle()).get()
                        .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                            @Override
                            public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
                                DocumentReference postRef = usersRef.document("posts");
                                DocumentSnapshot postSnapshot = null;
                                try {
                                    postSnapshot = transaction.get(postRef);
                                } catch (FirebaseFirestoreException e) {
                                    e.printStackTrace();
                                }
                                long newApplicants = postSnapshot.getLong("applicants") + 1;
                                transaction.update(postRef, "applicants", newApplicants);
                            }
                        });
                return null;
            }
        }).addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                Toast.makeText(context, "You have applied to this job!", Toast.LENGTH_SHORT).show();
            }
        });

Этот метод запускается при нажатии кнопки «Применить». Аргумент 'position' - это просто позиция, в которой сообщение хранится в локальном ArrayList<Post> list.

Как я могу просто увеличить значение applicants сообщения?

1 Ответ

1 голос
/ 18 марта 2020

Правильный способ сделать это - использовать Транзакция (щелкните эту ссылку на go в документации). В основном, как они работают, подробно описано в документации:

Используя клиентские библиотеки Cloud Firestore, вы можете сгруппировать несколько операций в одну транзакцию. Транзакции полезны, когда вы хотите обновить значение поля на основе его текущего значения или значения какого-либо другого поля.

И вы используете транзакцию правильным способом, но не в лучшем случае. Поскольку вы хотите обновить только одно значение транзакции, это может стать перегрузкой для вашей базы данных. Простой метод приращения выполнит эту работу, используя FieldValue.increment () :

DocumentReference postRef = db.collection("users").document(userId).collection("posts").document(postId);

// Atomically increment the population of the city by 50.
washingtonRef.update("applicants", FieldValue.increment(50));

Вам необходим идентификатор сообщения, которое вы хотите обновить.

Чтобы решить эту проблему, вам нужно просто отредактировать класс Post и добавить следующее:

string id;

public void setId(string id) {
   this.id = id;
}

public string getId() {
   return id; 
}

И когда вы получаете сообщения, просто сделайте это (иначе как узнать идентификатор сообщения):

for (DocumentSnapshot documentSnapshot : documentSnapshots.getDocuments()) { 
    Post post = new Post(); 
    post.setId(documentSnapshot.getId());
    post.setTitle(documentSnapshot.getString("title")); 
    post.setApplicants(documentSnapshot.getLong("applicants")); ... list.add(post); 
} 
notifyDataSetChanged();

И при обновлении поля applicants для получения идентификатора документа просто выполните:

string postId = post.getId();

, затем продолжите с обычным кодом.

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