Удаление предметов в пожарном магазине на основе метки времени - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь удалить элементы в хранилище на основе метки времени документов, я уверен, что код верен, и я точно уверен, что метки времени совпадают, и все же я получаю нулевой указатель

  java.lang.NullPointerException: Attempt to invoke virtual method 
  'com.google.android.gms.tasks.Task 
  com.google.firebase.firestore.DocumentReference.delete()' on a null object 
  reference

Итак, вот что у меня есть ... когда начинается действие, я запускаю запрос и получаю все документы с сообщениями из хранилища, затем помещаю их в объекты и отображаю их в виде переработчика с помощью специального адаптера (основные вещи).Сейчас я создаю метод удаления, поэтому я создал метод в своем адаптере, который добавляет выбранные элементы в список, который я могу получить, чтобы начать удаление (getSelectedItems), и я использую запрос Firestore ниже для удаленияэлементы

ArrayList<UserMessage> messages = new ArrayList<>();
messages.addAll(mMessageAdapter.getSelectedItems());
final CollectionReference userRef =
            db.collection("users")
                    .document(userId)
                    .collection("contacts")
                    .document(myUser.get_id())
                    .collection("messages");
for (UserMessage message : messages) {

        System.out.println(message.getTime_stamp());
        //this prints like this- Sat Jun 02 12:20:56 GMT+01:00 2018

        Query query = userRef.whereEqualTo("time_stamp", 
        message.getTime_stamp());
        query.get().addOnCompleteListener(new 
        OnCompleteListener<QuerySnapshot>() {
            @Override                                                                   
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    System.out.println("found an item to delete");
                    for (DocumentSnapshot doc : task.getResult()) {
                        doc.getDocumentReference(doc.getId())
                                .delete()
                                .addOnSuccessListener(new 
                                    OnSuccessListener<Void>() {
                                    @Override
                                    public void onSuccess(Void aVoid) {
                                     System.out.println("deleted an item");
                                        messagesDeleted[0]++;
                                        prog3Message = ("Deleted " + 
                                        messagesDeleted[0] + " of " + 
                                        allMessages[0] + " messages");
                                        runOnUiThread(changeMessage);
                                    }
                                });
                    }
                    if (messagesDeleted[0] == allMessages[0]) {
                        prog3.dismiss();
                        showMenuItems = false;
                        ///selectedMessageList.clear();
                        hideShowMenu(showMenuItems);
                        mMessageAdapter.clearSelections();
                        //System.out.println("all complete ");
                    }
                } else {

                }
            }
        });
    }

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

I/System.out: object data Sat Jun 02 12:20:56 GMT+01:00 2018
I/System.out: document data Sat Jun 02 12:20:56 GMT+01:00 2018
I/System.out: object data Sat Jun 02 12:23:16 GMT+01:00 2018
I/System.out: document data Sat Jun 02 12:23:16 GMT+01:00 2018

, что, как вы видите, совпадает с печатью из метода удаления, описанного выше - Сб 02 июня 12:20:56 GMT + 01: 00 2018 - и все же я получаю нулевой указатель, когдапри выполнении запроса один интересный факт заключается в том, что когда вы отправляетесь в firestore, отметка времени показывает, как это 1 июня 2018 года в 17:55:49 UTC + 1, который является другим форматом и другим регионом, поэтому я попытался немного поиграть с ним и закончилдо этого (не очень элегантно)

SimpleDateFormat dateFormat = 
new SimpleDateFormat("MMMM dd, yyyy HH:mm:ss aa", Locale.US);
    dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
    String formatted = dateFormat.format(message.getTime_stamp());
        String[] parts = formatted.split(" ");
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < parts.length; i++){
            if(i == 2){
                stringBuilder.append(parts[i] + " at ");
            }else if (i == parts.length -1){
                stringBuilder.append(parts[i].toUpperCase() + " UTC+1");
            }else{
                stringBuilder.append(parts[i] + " ");
            }
        }
        System.out.println(stringBuilder.toString());
        //June 02, 2018 at 11:20:56 AM UTC+1

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

1 Ответ

0 голосов
/ 02 июня 2018

Я не мог понять это и решил вместо этого написать сообщение в firestore, а затем обновить элемент с его идентификатором, чтобы он читал collection (user) document {userId} collection (contacts) document {contactId} collection (messages) document {messageId} значения документа id = значения messageId message = "бла-бла", таким образом я могу удалить каждый элемент по его идентификатору

...