【问题标题】:Deleting items in firestore based on timestamp根据时间戳删除firestore中的项目
【发布时间】:2018-06-02 14:10:33
【问题描述】:

我正在尝试根据文档时间戳删除 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 获取所有消息文档,然后我将它们放入对象中并使用自定义适配器将它们显示在回收器视图中(基本的东西)。我现在正在做的是创建一个删除方法,所以我在我的适配器中创建了一个方法,将所选项目添加到我可以开始删除的列表中(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

如您所见,它与上述删除方法中的打印相匹配 - Sat Jun 02 12:20:56 GMT+01:00 2018 - 但是在运行查询时我得到一个空指针,一个有趣的事实是当您转到firestore,时间戳显示像这样 2018 年 6 月 1 日下午 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

这给了我正确的模式,但现在已经过了一个小时,谁能告诉我我是否想在这里重新发明轮子,希望有更好的方法

【问题讨论】:

    标签: android firebase timestamp google-cloud-firestore


    【解决方案1】:

    我无法弄清楚这一点,并决定改为向 Firestore 写入一条消息,然后使用其 id 更新该项目,以便它读取集合(用户)文档 {userId} 集合(联系人)文档 {contactId} 集合(消息)文档 { messageId} 文档值 id = messageId 值 message = "blah blah" 这样我可以按其 id 删除每个项目

    【讨论】:

      猜你喜欢
      • 2020-11-03
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      • 2022-10-14
      • 2020-12-22
      • 2012-10-01
      相关资源
      最近更新 更多