Java 如何按日期对Firebase DocumentReferences地图进行排序?
我正在尝试使用Firebase云构建一个小型聊天应用程序。我在Firebase数据库中创建了以下结构: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
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”(时间戳中的时间),
无论何时在这个房间里发送消息,你只需要用最新的时间戳更新它。
然后你可以按特定的顺序得到所有的房间
为什么要在时间戳中节省时间
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
}
}
}
});