如何从Firebase实时数据库中检索时间戳,并在文本视图中显示为日期



我可以生成时间戳并将其存储在Firebase实时数据库中。但无法确定如何检索它并在文本视图中显示它。我知道它是作为一个长值检索并存储为Map我还在模型类中创建了以下内容,但不知道下一步该怎么做。

private Map<String, String> timestamp;

发送信息的代码

private void sendMessage(String sender, final String receiver, String message) {
if (sender.equals(receiver)){
Toast.makeText(MessageActivity.this,"Message Can't be sent",Toast.LENGTH_SHORT).show();
}
else {
HashMap<String, Object> hashMap = new HashMap<>();
hashMap.put("sender", sender);
hashMap.put("receiver", receiver);
hashMap.put("message", message);
hashMap.put("timestamp", ServerValue.TIMESTAMP);
hashMap.put("isseen", false);

DatabaseReference Chatreference = FirebaseDatabase.getInstance().getReference("Chats");
Key = Chatreference.child(ChatKey).push().getKey();
Chatreference.child(ChatKey).child(Key).setValue(hashMap);
}

读取信息的代码

private void readMessages(String myid, String userid, String imageurl) {
mChat = new ArrayList<>();
Chatreference = FirebaseDatabase.getInstance().getReference("Chats").child(ChatKey);

Chatreference.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
Chat chat = dataSnapshot.getValue(Chat.class);
if (chat.getReceiver().equals(myid) && chat.getSender().equals(userid) ||
chat.getReceiver().equals(userid) && chat.getSender().equals(myid)) {
chat.setMessageId(dataSnapshot.getKey());
mChat.add(chat);
Log.d(TAG, "Child_Event_Listener_Called");
Log.d(TAG, "msg " + chat.getMessage());
}
messageAdapter = new MessageAdapter(MessageActivity.this, mChat, imageurl);
recyclerView.setAdapter(messageAdapter);
messageAdapter.notifyDataSetChanged();

}

@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
Chat chat = dataSnapshot.getValue(Chat.class);
chat.setMessageId(dataSnapshot.getKey());
mChat.remove(chat);
messageAdapter.notifyDataSetChanged();

}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}

更新型号类别

public class Chat {
private String sender;
private String receiver;
private  String message;
private boolean isseen;
private Map<String, String> timestamp;
String MessageId;

public Chat(String sender, String receiver, String message, boolean isseen, Map<String, String> timestamp) {
this.sender = sender;
this.receiver = receiver;
this.message = message;
this.isseen = isseen;
this.timestamp = timestamp;
}
public Chat() {
}
public String getSender() {
return sender;
}
public void setSender(String sender) {
this.sender = sender;
}
public String getReceiver() {
return receiver;
}
public void setReceiver(String receiver) {
this.receiver = receiver;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getMessageId() {
return MessageId;
}
public void setMessageId(String messageId) {
MessageId = messageId;
}
public boolean isIsseen() {
return isseen;
}
public void setIsseen(boolean isseen) {
this.isseen = isseen;
}
public Map<String, String> getTimestamp() {
return timestamp;
}
public void setTimestamp(Map<String, String> timestamp) {
this.timestamp = timestamp;
}
@Override
public boolean equals(@Nullable Object obj) {
if(obj instanceof Chat){
Chat chat=(Chat) obj;
return this.MessageId.equals(chat.getMessageId());}
else
return false;
}
}

首先时间戳是一个长值,而不是映射。你必须在聊天类中更改

//...
private boolean isseen;
private long timestamp;
String MessageId;
//...

然后您可以将时间戳转换为日期字符串,如下所示:

public static  String longToDateString(long timestamp, String format){
return DateFormat.format(format,new Date(timestamp)).toString();
}

使用

String date = longToDateString(mChat.get(position).getTimestamp, "dd.MM.yyyyy");

String time = longToDateString(mChat.get(position).getTimestamp, "HH:mm");

您想要的是在FirebaseDatabase中读取一个child。下面是一个关于如何通过将从firebase获得的snapshot读取子元素的示例。这里的模型不同,因为您的数据库中会有不同的NoSql结构。

var userId = firebase.auth().currentUser.uid;
return firebase.database().ref('/users/' + userId).once('value').then(function(snapshot) {
var username = (snapshot.val() && snapshot.val().username) || 'Anonymous';
// ...
});

此外,根据存储时间戳的数据类型,firebase返回的值可以是longString。看起来它是以String的形式发送的。

最新更新