web-dev-qa-db-fra.com

Ordre des données Firestore par horodatage dans l'ordre croissant

Je stocke les idées publiées par l'application dans Firestore. Les données sont stockées dans Firestore comme ceci Ideas/{documentID}/IdeaObject. Le problème est que lorsque je récupère les données, elles ne sont pas triées au moment de leur publication. Les idées récupérées sont conformes aux identifiants de leur documentID qui est automatiquement créé par Firestore. J'ai utilisé ServerTimestamp dans ma classe de modèle et aussi quand je le récupère, j'utilise la méthode orderBy avec ma référence Firestore mais toujours rien.

Idea.Java

public class Idea {
    @ServerTimestamp
    private Date date;
    private String title, idea, timeCommitment, ideaStage, postedBy, website, videoPitch;
    private int views, favorites;
    private ArrayList<String> lookingFor = new ArrayList<>();
    private ArrayList<String> tags = new ArrayList<>();
    private String userID;
    private String timeStamp;

    public Idea() {
    }

    public Idea(String title, String idea, String timeCommitment, String ideaStage, String postedBy, String website, String videoPitch, int views, int favorites, ArrayList<String> lookingFor, ArrayList<String> tags, String userID, String timeStamp) {
        this.title = title;
        this.idea = idea;
        this.timeCommitment = timeCommitment;
        this.ideaStage = ideaStage;
        this.postedBy = postedBy;
        this.website = website;
        this.videoPitch = videoPitch;
        this.views = views;
        this.favorites = favorites;
        this.lookingFor = lookingFor;
        this.tags = tags;
        this.userID = userID;
        this.timeStamp = timeStamp;
    }

Méthode de publication des idées

  private void postIdea() {

        final String ideaID = UUID.randomUUID().toString();
        final SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss");
        Timestamp timestamp = new Timestamp(System.currentTimeMillis());


        Idea ideas = new Idea(title, idea, timeCommitment, ideaStage, AppValues.fullName, website, videoPitch, 0, 0, lookingFor, tags, AppValues.userId, "" + timestamp.getTime());

        firestoreDb.collection("ideas")
                .document(ideaID)
                .set(ideas)
                .addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        postIdeaUser(ideaID);
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        hideLoadingDialog();
                        showToast(e.getMessage());
                    }
                });
    }

Récupérer toutes les idées par heure

   firestoreDb.collection("ideas")
                .orderBy("timeStamp", Query.Direction.ASCENDING)
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()) {

                            ideaArrayList = new ArrayList<>();
                            ideaArrayList.clear();

                            for (DocumentSnapshot documentSnapshot : task.getResult()) {
                                Idea idea = documentSnapshot.toObject(Idea.class);
                                if (!idea.getUserID().equals(AppValues.userId)) {
                                    ideaArrayList.add(idea);
                                }
                            }

                            callAdapter();

                        } else {
                            Log.d(TAG, "Error getting documents: ", task.getException());
                            progressBar.setVisibility(View.GONE);
                            swipeRefresh.setEnabled(true);
                            errorText.setVisibility(View.VISIBLE);
                        }
                    }
                }); 

Ce que je veux réaliser, c'est récupérer toutes les idées et les faire classer par ordre croissant de la valeur TimeStamp.

7
Ebad Ali

Vous ne pouvez pas utiliser une chaîne (timeStamp) lors de l'interrogation de votre base de données au lieu d'une date (date) et vous attendre à se comporter comme s'il s'agissait d'une date. Pour résoudre ce problème, veuillez modifier la ligne de code suivante:

firestoreDb.collection("ideas")
            .orderBy("timeStamp", Query.Direction.ASCENDING)

à

firestoreDb.collection("ideas")
            .orderBy("date", Query.Direction.ASCENDING)
13
Alex Mamo

Dans mon cas, la version Vanilla serait,

firestoreDb.collection("ideas")
     .orderBy("timestamp", "asc")

firestoreDb.collection("ideas")
     .orderBy("timestamp", "desc")

"idées" est le nom de votre collection

"timestamp" est le nom de la clé ou du champ ou de la colonne à utiliser pour le tri.

"asc" ou "desc" est l'option à utiliser pour la commande

1
Vince Banzon