【问题标题】:Firebase interval combined queryFirebase 间隔组合查询
【发布时间】:2017-05-14 01:50:15
【问题描述】:

我有一个结构如下的 firebase 数据库:

-users
    -[userID from the account]
        -[interval key generated automatically with push]
            -start: timestamp
            -end: timestamp
            -color: black
        -[interval key]
            -start: timestamp
            -end: timestamp
            -color: red
        -[interval key]
            -start: timestamp
            -end: timestamp
            -color: green
    -[userID2 from the account]
        -[interval key]
            -start: timestamp
            -end: timestamp
            -color: black
        -[interval key]
            -start: timestamp
            -end: timestamp
            -color: white
        -[interval key]
            -start: timestamp
            -end: timestamp
            -color: red

使用 android 我不明白如何进行一些组合查询。

如果我有:

long start = 1494637200000;
long end =   1494640800000;

和:

DatabaseReference userRef = dbRef.child("users").child(uid);

如果我不能使用 orderByChild() 超过 1 次:

1)如何从数据库中获取与startend 重叠的所有区间?

Sql:

select * from [userID] where start + " < " + 1494640800000 + " AND " + end + " > " + 1494637200000

2)我如何从数据库中获取与startend 重叠的所有间隔,但只能使用颜色“black”?

Sql:

select * from [userID] where start + " < " + 1494640800000 + " AND " + end + " > " + 1494637200000 AND color = "black"

(我接受不同语言的答案,只是让它易于理解)

【问题讨论】:

    标签: android firebase firebase-realtime-database nosql


    【解决方案1】:

    在开始创建这些查询之前,我建议您查看本教程,名称为:The Firebase Database For SQL Developers。您将学习实现您想要的确切目标的确切方法。

    要转换如下所述的值,请使用以下代码:

    String firebaseField = "1494637200000_1494640800000_black";
    ArrayList<String> arrayList = new ArrayList<>();
    
    String[] data = firebaseField.split("_");
    for(String part : data) {
        arrayList.add(part);
    }
    
    long start = Long.valueOf(arrayList.get(0));
    long end = Long.valueOf(arrayList.get(1));
    String color = arrayList.get(2);
    
    if(yourStartValue < start && yourEndValue > end && color.equals("black")) {
        //Your logic here
    }
    

    希望对你有帮助。

    【讨论】:

    • 我之前已经看过这个教程,唯一的方法是查询 2-3 个孩子,将它们组合成一个由特殊字符分隔的值。这是唯一的方法?
    • 是的,没错。这是 Firebase 中的常见做法。
    • 如果一段时间后,我想通过其他 3 个参数查询它们,我应该用新的值更新所有间隔吗?在您看来,在每个客户中逐个过滤它们会更昂贵?
    • 逐个查询不是很好的选择,只需要查询一次。作为一个建议,因为 Firebase 是一个 NoSQL 数据库,所以尽量不要用 SQL 来解决问题。在 Firebase 中,我们不使用 SELECTWHERE 子句。关于您的问题,您可以更新但也可以根据需要使用特定查询创建另一个间隔。
    • 一次性查询所有项目(间隔)并为每个子项(开始、结束、颜色)调用 getValue() 会自行执行其他查询吗?
    猜你喜欢
    • 2011-11-09
    • 2012-04-14
    • 1970-01-01
    • 2021-08-04
    • 2023-02-21
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多