使用iOS Swift提前查询和过滤Firebase

问题描述:

我正在使用Firebase数据库构建购票应用程序。这里是我的数据库格式: enter image description here使用iOS Swift提前查询和过滤Firebase

如果我写这样的代码:

let ref = FIRDatabase.database().reference() 

    ref.child("jadwal") 
     .queryOrderedByChild("tanggal") 
     .queryEqualToValue("17/08/2016") 
     .observeEventType(.ChildAdded, withBlock: { (snapshot) in 

     print(snapshot) 

    }, withCancelBlock: nil) 

输出将是:

Snap (-KPMQefHSuk7j9kb3GTJ) { 
    asal = BNA; 
    harga = 177000; 
    idBus = id; 
    jam = "20:00"; 
    tanggal = "17/08/2016"; 
    tersedia = 35; 
    tujuan = BRN; 
} 
Snap (-KPMQnCGrXY36NEMxSOU) { 
    asal = BNA; 
    harga = 150000; 
    idBus = id; 
    jam = "20:00"; 
    tanggal = "17/08/2016"; 
    tersedia = 37; 
    tujuan = MDN; 
} 
Snap (-KPMQqFmku_XzItElzjV) { 
    asal = BNA; 
    harga = 160000; 
    idBus = id; 
    jam = "20:00"; 
    tanggal = "17/08/2016"; 
    tersedia = 40; 
    tujuan = MDN; 
} 

,它会显示所有的“tanggal”具有同等的价值到“17/08/2016”, 当我这样做...

let ref = FIRDatabase.database().reference() 

    ref.child("jadwal") 
     .queryOrderedByChild("harga") 
     .observeEventType(.ChildAdded, withBlock: { (snapshot) in 

     print(snapshot) 

    }, withCancelBlock: nil) 

它会显示所有的“价格”从低责令高这样的:

Snap (-KPNgVeXXnqnzevh5w6u) { 
    asal = BNA; 
    harga = 120000; 
    idBus = id; 
    jam = "22:30"; 
    tanggal = "30/08/2016"; 
    tersedia = 38; 
    tujuan = TKG; 
} 
Snap (-KPMQnCGrXY36NEMxSOU) { 
    asal = BNA; 
    harga = 150000; 
    idBus = id; 
    jam = "20:00"; 
    tanggal = "17/08/2016"; 
    tersedia = 37; 
    tujuan = MDN; 
} 
Snap (-KPMQqFmku_XzItElzjV) { 
    asal = BNA; 
    harga = 160000; 
    idBus = id; 
    jam = "20:00"; 
    tanggal = "17/08/2016"; 
    tersedia = 40; 
    tujuan = MDN; 
} 
Snap (-KPMQefHSuk7j9kb3GTJ) { 
    asal = BNA; 
    harga = 177000; 
    idBus = id; 
    jam = "20:00"; 
    tanggal = "17/08/2016"; 
    tersedia = 35; 
    tujuan = BRN; 
} 
Snap (-KPNgJPRlEuu0FZvjU2J) { 
    asal = BNA; 
    harga = 180000; 
    idBus = id; 
    jam = "21:30"; 
    tanggal = "25/08/2016"; 
    tersedia = 40; 
    tujuan = MDN; 
} 
Snap (-KPNgQ2qQXQpY4eT2Jqd) { 
    asal = BNA; 
    harga = 230000; 
    idBus = id; 
    jam = "22:30"; 
    tanggal = "30/08/2016"; 
    tersedia = 38; 
    tujuan = BNJ; 
} 

看到“价格”排序 但我需要显示快照,显示“价格”的列表进行排序和只有“tanggal”是“17/08/2016”。 我总是无法做到这一点,主要与“多orderBy()”错误,我需要查询和过滤数据基于两个或更多的孩子值。基本上我想基于“harga”进行排序,基于“tanggal”,“asal”,“tujuan”以及“tersedia”的最小数量进行过滤 请帮助我,我想将我的db从SQL切换到Firebase。谢谢。

+0

您只能在Firebase查询中使用一个'orderBy'子句。有时你可以将你想要在单个属性中过滤/排序的值组合起来,但这取决于你的确切用例。请参阅http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase –

目前无法通过Firebase中的多个子键查询。我会建议两个可能的解决方案:

第一个解决方案:压扁你的数据库结构。

说明:不是只是一个“jadwal”所有的儿童区,需要实现这样的结构:

jadwal: { 
    "17/08/2016": { 
     harga: 
    }, 
    "17/07/2016": { 
     harga: 
    } 
} 

然后,您可以根据该“tanggal”通过过滤选择路径,然后按照“harga”的价值对孩子进行分类。

解决方法二:做一些过滤在客户端

说明:您使用排序依据(“价格”)在jadwal查询,然后在客户端上的childAdded听众,筛选结果。这意味着你会检查孩子是否有预期的tanggal。如果有,请将其添加到结果数组中。否则,转到下一个孩子。

让我知道你是否还有其他问题。

+0

你能解释我更多关于扁平化我的数据库结构吗?我还没弄明白。谢谢。 – chronycles