アプリケーションによって投稿されたアイデアをFirestoreに保存しています。データは、このようにFirestoreに保存されますIdeas/{documentID}/IdeaObject。問題は、データを取得するときに、投稿された時間にソートされていないことです。取得されるアイデアは、Firestoreによって自動的に作成されるdocumentIDのIDに基づいています。モデルクラスでServerTimestampを使用し、それを取得するときに、Firestore参照でorderBy
メソッドを使用していますが、それでも何も使用していません。
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;
}
アイデアの投稿方法
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());
}
});
}
時間ごとにすべてのアイデアを取得する
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);
}
}
});
私が達成したいのは、すべてのアイデアを取得し、それらをTimeStamp値で昇順に並べることです。
データベースを照会するときに、日付(timeStamp
)の代わりに文字列(date
)を使用することはできず、日付として動作することを期待できます。これを解決するには、次のコード行を変更してください。
firestoreDb.collection("ideas")
.orderBy("timeStamp", Query.Direction.ASCENDING)
に
firestoreDb.collection("ideas")
.orderBy("date", Query.Direction.ASCENDING)
私の場合、バニラバージョンは、
firestoreDb.collection("ideas")
.orderBy("timestamp", "asc")
firestoreDb.collection("ideas")
.orderBy("timestamp", "desc")
「アイデア」はコレクションの名前です
「タイムスタンプ」は、ソートに使用されるキー、フィールド、または列名です。
「asc」または「desc」は、注文に使用するオプションです