Firebase Firestore订单不工作

时间:2018-02-05 14:34:53

标签: android firebase google-cloud-firestore

我通过官方文档了解Firebase Firestore。我正在尝试使用代码。使用firestore的add()方法添加通知。

FirebaseFirestore.getInstance().colRefNotifications()
            .orderBy("timestamp", Query.Direction.DESCENDING)
            .get()
            .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
        @Override
        public void onSuccess(QuerySnapshot documentSnapshots) {

            if (!documentSnapshots.isEmpty()){

                listNotifications.clear();
                recyclerViewNotification.removeAllViews();

                for (DocumentSnapshot data : documentSnapshots){

                    Notification notification = data.toObject(Notification.class);
                    listNotifications.add(notification);
                }

                notificationGeneralAdapter.notifyDataSetChanged();
            }
        }
    });

Notification.java

private String text;
private String key;
private Date timestamp;

public Notification() {
}

public Notification(String text, String key, Date timestamp) {
    this.text = text;
    this.key = key;
    this.timestamp = timestamp;
}

public String getText() {
    return text;
}

public String getKey() {
    return key;
}

public Date getTimestamp() {
    return timestamp;
}

公司的FireStore

firestore_snapshot

我按时间戳按降序排序通知。但是,正如您在下面的快照中看到的那样,它没有显示所需的输出。

Snapshot

我做错了什么?谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

由于嵌套查询,这种情况正在发生。如果将查询放在侦听器中(成功/失败/完成),则orderBy方法将不起作用。将您的下一个查询放在RecyclerView适配器的onBindViewHolder中。

FirebaseFirestore.getInstance().colRefNotifications()
        .orderBy("timestamp", Query.Direction.DESCENDING)
        .get()
        .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
    @Override
    public void onSuccess(QuerySnapshot documentSnapshots) {

        if (!documentSnapshots.isEmpty()){
           ....

           /**If you are nesting queries like this, move second query to**/
           /**onBindViewHolder of the RecyclerView adapter**/

           FirebaseFirestore.getInstance().colRefUsers()
           .get()
           .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
           @Override
           public void onSuccess(QuerySnapshot documentSnapshots) {

               if (!documentSnapshots.isEmpty()){
               ....

               }
             }
          });
        }
    }
});

答案 1 :(得分:1)

这种情况正在发生,因为您没有将时间戳用作服务器值时间戳。您正在使用Date类设置时间戳,这不是您必须执行的操作。

Here是如何使用模型类添加时间戳的。所以,根据我在该帖子中的回答更改您的模型类,也不要忘记@ServerTimestamp注释,然后您的查询将正常工作。