Java 如何按日期对Firebase DocumentReferences地图进行排序?

Java 如何按日期对Firebase DocumentReferences地图进行排序?,java,android,firebase,google-cloud-firestore,Java,Android,Firebase,Google Cloud Firestore,我正在尝试使用Firebase云构建一个小型聊天应用程序。我在Firebase数据库中创建了以下结构: Collection "users" -> bob@gmail.com document -> map of "chat rooms" field (type Map<String, DocumentReference>) Collection chatRooms -> room id document -> Coll

我正在尝试使用Firebase云构建一个小型聊天应用程序。我在Firebase数据库中创建了以下结构:

Collection "users" -> bob@gmail.com document -> map of "chat rooms" field (type Map<String, DocumentReference>)
Collection chatRooms -> room id document -> Collection messages -> message id document -> fields
我想为当前用户的所有聊天室创建一个RecyclerView。所以我所做的是:

FireDB.collection("users").document(connectedEmail).get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
    @Override
    public void onSuccess(DocumentSnapshot documentSnapshot) {
        Log.d(this.getClass().getName(), "addOnSuccessListener:success");
        if (!(documentSnapshot.exists())) {
            // TODO
            return;
        }
        Map<String, DocumentReference> chatRooms = (Map<String, DocumentReference>) documentSnapshot.get("chatRooms");
        if (chatRooms.isEmpty()) {
            // TODO
            return;
        }
    }
}).addOnFailureListener(new OnFailureListener() {

    @Override
    public void onFailure(@NonNull Exception e) {
        Log.d(this.getClass().getName(), "addOnSuccessListener:failed");
    }
});

FireDB.collection(“users”).document(connectedEmail.get().addOnSuccessListener(新的OnSuccessListener()){
@凌驾
成功时公共无效(文档快照文档快照){
Log.d(this.getClass().getName(),“addOnSuccessListener:success”);
如果(!(documentSnapshot.exists()){
//待办事项
返回;
}
映射聊天室=(Map)documentSnapshot.get(“聊天室”);
if(chattrooms.isEmpty()){
//待办事项
返回;
}
}
}).addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Log.d(this.getClass().getName(),“addOnSuccessListener:失败”);
}
});

到最后一条消息的日期,访问聊天室地图的最简单方法是什么?我想在
room id document
级别中保留最近一次接触此文档的时间,但我想知道是否可以使用Firebase而不添加特殊支持。

是的,每当发送消息时,您必须更新聊天室文档, Firebase Firestore不会自动向写入添加时间戳

假设您在文件室文档中有字段“updated_at”(时间戳中的时间), 无论何时在这个房间里发送消息,你只需要用最新的时间戳更新它。 然后你可以按特定的顺序得到所有的房间

为什么要在时间戳中节省时间

  • Firebase推荐它
  • 使用orderBy中的方向查询文档更容易
  • 可轻松转换为任何日期显示,无需太多代码
  • 实现示例

      FirebaseFirestore.getInstance().collection("YOUR_COLLECTION") 
                    .whereEqualTo("your_key", "your_value")
                    .orderBy("lastUpdateTime", Query.Direction.DESCENDING)
                    .addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
                if (queryDocumentSnapshots != null) {
                    if (!queryDocumentSnapshots.isEmpty()) {
    
                     //DATA returned, You can use Gson to convert them to your POJO list
    
                    } else {
    
                        //NO DATA RETURNED
    
                    }
    
                }
            }
        });
    
    FirebaseFirestore.getInstance()集合(“您的集合”)
    .whereEqualTo(“你的钥匙”、“你的价值”)
    .orderBy(“lastUpdateTime”,Query.Direction.DESCENDING)
    .addSnapshotListener(新的EventListener(){
    @凌驾
    public void OneEvent(@Nullable QuerySnapshot queryDocumentSnapshots,@Nullable FirebaseFirestoreException e){
    if(queryDocumentSnapshots!=null){
    如果(!queryDocumentSnapshots.isEmpty()){
    //返回的数据,您可以使用Gson将其转换为POJO列表
    }否则{
    //没有返回任何数据
    }
    }
    }
    });
    
    时间戳是指1970年的纪元时间?不,是Firebase时间戳。你可以在这里有更多的信息哦,我明白了,谢谢。那么,我如何在这里使用
    .orderBy(“lastUpdateTime”,Query.Direction.ASCENDING)
    呢?您能更具体一点吗?如果我插入该字段,我如何迭代DocumentReference并创建DocumentReference或Snapshot的排序映射?
      FirebaseFirestore.getInstance().collection("YOUR_COLLECTION") 
                    .whereEqualTo("your_key", "your_value")
                    .orderBy("lastUpdateTime", Query.Direction.DESCENDING)
                    .addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
                if (queryDocumentSnapshots != null) {
                    if (!queryDocumentSnapshots.isEmpty()) {
    
                     //DATA returned, You can use Gson to convert them to your POJO list
    
                    } else {
    
                        //NO DATA RETURNED
    
                    }
    
                }
            }
        });