为了使用应用程序中已有的数据,我想重用来自自定义查询的快照结果。
此自定义查询按值 q.orderByChild(child)
进行搜索。
我们的想法是,自定义查询和普通查询(通常我的意思是按照他们被推送的顺序带来孩子的查询)都有类似的限制。
限制是 15 个孩子,这是一个很小的数字,也是我认为这是最经济的方法的部分原因。
... 当数据库达到一定数量的子级(> 15 个)时,普通查询变为未使用,其他查询变为可用。
这使得这个普通的查询变得浪费,如果我可以重用来自其他查询的可用数据,比如使用自定义查询的数据,那就太好了。
乍一看,数据库似乎是按字母顺序生成键,在这种情况下,我可以使用 Collections.sort(list, String.CASE_INSENSITIVE_ORDER);
来复制正常的查询顺序。
我不确定的是,按键是否遵循一些我不知道的其他规则,比如小写和大写? OR 该算法如何处理减号和其他非字母字符。
简而言之,是否可以手动对 Firebase 自动生成的键进行排序?
答案 0 :(得分:0)
此功能似乎按预期工作。 String.class 的 Comparable 接口似乎可以毫无不便地处理所有事情,并且自动生成的 Firebase 键似乎是根据 Comparator 的排序指南创建的
public enum OrderType {
DESC, ASC
}
public static<X, Y extends Comparable<? super Y>> List<X> query(
List<X> from,
Function<X, Y> orderBy,
OrderType orderType
) {
List<X> result = new ArrayList<>(from);
Comparator<Y> comparator = orderType.equals(OrderType.ASC) ?
(o1, o2) -> o1.compareTo(o2) :
(o1, o2) -> o2.compareTo(o1);
return result
.stream()
.sorted(Comparator.comparing(
orderBy,
comparator
))
.collect(Collectors.toList());
}
这里的实现:
private LiveData<List<Element>> testPickUpElements() {
return Transformations.map(
baseValueElements,
input -> {
return Comparators.query(
input,
Element::getElementDBKey,
OrderType.ASC
);
}
);
}