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.
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)
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