是否可以手动对 Firebase 自动生成的键进行排序?

时间:2021-07-15 19:47:11

标签: java firebase-realtime-database

为了使用应用程序中已有的数据,我想重用来自自定义查询的快照结果。 此自定义查询按值 q.orderByChild(child) 进行搜索。

我们的想法是,自定义查询和普通查询(通常我的意思是按照他们被推送的顺序带来孩子的查询)都有类似的限制。

限制是 15 个孩子,这是一个很小的数字,也是我认为这是最经济的方法的部分原因。

... 当数据库达到一定数量的子级(> 15 个)时,普通查询变为未使用,其他查询变为可用。

这使得这个普通的查询变得浪费,如果我可以重用来自其他查询的可用数据,比如使用自定义查询的数据,那就太好了。

firebase's real time pushed keys

乍一看,数据库似乎是按字母顺序生成键,在这种情况下,我可以使用 Collections.sort(list, String.CASE_INSENSITIVE_ORDER); 来复制正常的查询顺序。

我不确定的是,按键是否遵循一些我不知道的其他规则,比如小写和大写? OR 该算法如何处理减号和其他非字母字符。

简而言之,是否可以手动对 Firebase 自动生成的键进行排序?

1 个答案:

答案 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
                    );
                }
        );
    }
相关问题