代码之家  ›  专栏  ›  技术社区  ›  martinseal1987

基于时间戳删除firestore中的项目

  •  0
  • martinseal1987  · 技术社区  · 7 年前

    我正在尝试根据文档时间戳删除firestore中的项目,我相当确定代码是正确的,并且我确定时间戳匹配,但是我得到一个空指针

      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
    

    这是我到目前为止所知道的。。。当活动开始时,我运行一个查询并从firestore获取所有消息文档,然后将它们放入对象中,并用一个自定义适配器(basic stuff)在回收器视图中显示它们。我现在做的是创建一个delete方法,所以我在适配器中创建了一个方法,将所选项目添加到我可以开始删除的列表中(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
    

    正如您所看到的,它与上面的delete方法的一个打印匹配-Sat Jun 02 12:20:56 GMT+01:00 2018-但是我在运行查询时得到一个空指针,一个有趣的事实是,当您转到firestore时,时间戳显示如下6月1日,2018年下午5: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 回复  |  直到 7 年前
        1
  •  1
  •   martinseal1987    7 年前

    我无法理解这一点,于是决定改为向firestore写入一条消息,然后用它的id更新该项,这样它就可以读取集合(用户)文档{userId}集合(联系人)文档{contactId}集合(消息)文档{messageId}文档值id=messageId values message=“blah blah”,这样我就可以按其名称删除每个项身份证件