В настоящее время я использую FirebaseRecyclerAdapter для извлечения данных из базы данных Firebase, и я в значительной степени разобрался, как извлекать данные в нужном мне порядке.
Чтобы избежать дублирования и упростить обслуживание базы данных, я хотел бы добавить ключ к записи базы данных, который позволяет мне возвращать запросы на основе этого ключа. Я изначально хранил данные дважды. Один раз для всех, и один раз, если пользователь присоединился к определенной группе (под groupName).
Чтобы вернуть запрос на основе группы, мой первоначальный поиск был следующим:
databaseReference.child(groupName).child("exerciseId"+mExerciseId).orderByChild(sortOrder).limitToFirst(100);
но я считаю, что дублирования можно избежать, добавив ключ «группа» в мой пост. (это также значительно упрощает обслуживание, поскольку пользователи переключаются между группами).
Запрос базы данных «группа» теперь стал таким:
databaseReference.child("exerciseId"+mExerciseId).orderByChild("group").equalTo(groupName);
Все хорошо, за исключением того, что данные больше не сортируются по "sortOrder". Поскольку firebase не допускает нескольких критериев сортировки, я считаю, что мое решение заключается в автономной сортировке.
Итак, как же отсортировать адаптер в автономном режиме?
Мой адаптер довольно стандартный:
mAdapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(Post.class, R.layout.item_post, PostViewHolder.class, dataQuery)
{
@Override
protected void populateViewHolder(final PostViewHolder viewHolder, final Post model, final int position)
{
final DatabaseReference postRef = getRef(position);
// Bind Post to ViewHolder, setting OnClickListener for the star button
viewHolder.bindToPost(model, position, postRef.getKey(), null);
}
mRecycler.setAdapter(mAdapter);
}
Я реализовал Comparable в Post, проблема в том, где хранятся данные, чтобы я мог передать их в Collections.sort() таким образом:
private List<Post> mPosts = new ArrayList<>();
mPosts.add(model);
Collections.sort(mPosts, Post.Comparators.ALLTIME);