根据时间戳删除火存储中的项目



我正在尝试根据文档时间戳删除 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 {
}
}
});
}

因此,为了开始故障排除,我在第一个查询(获取所有消息(中为每个文档添加了一个 print 语句,我打印了文档和对象的时间戳(以防万一(,它像这样打印出来

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

如您所见,这与上面删除方法的打印匹配 - 周六 6月 02 12:20:56 GMT+01:00 2018 - 然而我在运行查询时得到一个空指针,一个有趣的事实是,当你去 Firestore 时,时间戳显示如下 六月 1, 2018 在 5:55:49 PM 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

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

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

最新更新