Я хочу удалить массив, хранящийся в Firestore - PullRequest
1 голос
/ 18 июня 2020

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

Я перечислил массивы в виде списка, используя RecyclerView. Удаление будет выполнено с помощью метода showPop().

Это моя база данных Firestore введите здесь описание изображения Я хочу удалить index-0

  private void showPopup(View v,final int position) {  

  PopupMenu popup = new PopupMenu(activity, v);
  popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener(){
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                switch (menuItem.getItemId()) {
                    .....
                    case R.id.delete: //delete
                        final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
                        final FirebaseFirestore db = FirebaseFirestore.getInstance();
                        final Map<String, Object> updates = new HashMap<>();
                        updates.put(user.getEmail(),FieldValue.delete());

                        //db.collection("medicinday").document(mDataset.get(position).getId())
                          //      .delete()
                        db.collection("medicinday").document(user.getEmail()).update("add_day", FieldValue.arrayRemove(user.getEmail()))
                                .addOnSuccessListener(new OnSuccessListener<Void>() {
                                    @Override
                                    public void onSuccess(Void aVoid) {
                                        Toast.makeText(....
                                    }
                                })
                                .addOnFailureListener(new OnFailureListener() {
                                    @Override
                                    public void onFailure(@NonNull Exception e) {
                                 ....

Ответы [ 2 ]

2 голосов
/ 19 июня 2020

Невозможно удалить / обновить элемент по указанному c индексу в массиве Firestore. Для получения дополнительной информации, пожалуйста, проверьте мой ответ из следующего сообщения:

Есть ли способ обновить указанный c индекс из массива в Firestore

В вашем конкретном случае свойство add_day - это массив, содержащий объекты. Если вы хотите удалить элемент из этого массива, вам необходимо передать все значение объекта элемента. Он будет не , если вы просто передадите индекс или одно из вложенных значений в этот элемент.

Для вашего типа данных вам нужно будет построить Map с точное содержимое вашего первого элемента и передайте этот объект методу update(), как в следующих строках кода:

String email = FirebaseAuth.getInstance().getCurrentUser().getEmail();
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference medicinDayRef = rootRef.collection("medicinday");
DocumentReference emailRef = medicinDayRef.document(email);
HashMap<String, Object> doc = new HashMap<>();
doc.put("day", "monday");
doc.put("king" , "A");
doc.put("nam" , "ren");
doc.put("time1" , "AM 7:30");
doc.put("time2" , "PM 2:30");
doc.put("time3" , "PM 8:30");
emailRef.update("add_day", FieldValue.arrayRemove(doc));

Имейте в виду, что если вы не знаете все содержимое элемента, он будет не работает.

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

Более подробную информацию об этом топе c можно найти здесь:

Android Firestore запрашивает конкретное значение в массиве Объекты

И в следующей статье:

Как сопоставить массив объектов из Cloud Firestore со списком объектов?

0 голосов
/ 19 июня 2020

Кажется, что ваша строка для удаления из Firestore закомментирована, если только это не сделано намеренно.

Судя по отправленной вами картинке, я понимаю, что add_day - это ваш массив, а 0 это элемент, который вы хотите удалить. Вы можете сделать это, обратившись к полю документа add_day, а затем используя arrayRemove () , чтобы специально удалить элемент по вашему выбору.

Примерно ссылаясь на связанную документацию, я считаю, что вы могли бы для этого выполните следующее.

DocumentReference doc = db.collection("medicinday").document("222@naver.com");

ApiFuture<WriteResult> remove = doc.update("add_day", FieldValue.arrayRemove("0"));

System.out.println("Update time : " + arrayRm.get());
...