如何使用firebase查询订单

时间:2015-11-28 20:57:54

标签: android firebase firebase-realtime-database

我在我的Android应用程序上使用firebase。我需要帮助才能找到麻烦的问题。我想做一个这样的请求:我正在使用oderbyChild(“date”)从最近的日期到最近的日期,通过这样做来查看我的数据。

MyApplication.backend.child(urls).orderByChild("value").addValueEventListener(new ValueEventListener() {
}

现在我想要选择活动值完成的所有位置,并按我的日期值排序主题。我写了这个:

MyApplication.backend.child(urls).orderByChild("task").equalTo("done").addValueEventListener(new ValueEventListener(){
}

我的问题是,在同一个fireBase查询中不可能执行2个两个ord​​erByChild。我怎样才能解决这个问题 ?请帮忙。

2 个答案:

答案 0 :(得分:2)

假设您的数据看起来像这样

activities
  -JKjasjiji
    date:   20151129
    is_done: false
  -Ykkjaso23
    date:   20151128
    is_done: true
  -Jkaisjiij
    date:   20151127
    is_done: false

有几种方法可以解决这个问题。

1)查询is_done:true的所有活动,然后在代码中对结果进行排序。根据数据集大小,这可能非常低效。在代码中排序1百万是不好的。

2)将完成的活动存储在另一个节点

activities
  -JKjasjiji
    date:   20151129
  -Jkaisjiij
    date:   20151127

done_activities
  -Ykkjaso23
    date:   20151128

3)以支持'和'类型查询的格式存储数据

activities
  -JKjasjiji
    done_and_date:   false_20151129
  -Ykkjaso23
    done_and_date:   true_20151128
  -Jkaisjiij
    done_and_date:   false_20151127

然后用户.startAt和.endAt ......

ref.orderByKey().startAt("true_20151128").endAt("true_20151129")

将返回在两个指定日期之间完成的所有活动。

答案 1 :(得分:2)

构建数据可以简化您的查询。

@ Jay的答案很棒。这是破解这个坚果的另一种方法,with the Bolt compiler

假设您正在构建费用报告应用,您的数据结构如下:

type User {
  name: String;
  uid: String;
}

type Expense {
  id: String;
  amount: Number;
  uid: uid;
  year: Number;
}

path /users/$uid is User;
path /expenses/$expense_id is Expense;

现在假设您希望获得2014年发生的用户1的所有费用。如果这是SQL,您可以说:

SELECT * 
FROM Expenses
WHERE uid == "1" AND year == 2014 

使用Firebase SDK,您可以执行以下操作:

ref.child('expenses')
   .orderByChild('uid')
   .equalTo('1')
   .orderByChild('year')
   .equalTo('2014');

但是,那是不可能的。那么我们该怎么办呢? 重新构建我们的数据以适应此类查询。

我们可以使用/expenses创建年份索引,而不是将所有费用存储在/expenses/year位置。这看起来像是:

路径/费用/ $ year / $ expense_id是费用

现在我们想要执行的查询可以通过以下方式实现:

ref.child('2014')
   .orderByChild('uid')
   .equalTo('1');

您为数据选择的结构将允许您根据需要获取数据。您可能会发现需要复制数据才能执行此操作。这没关系。如果您需要保留data consistent across multiple locations, you can use client-side fanout