iOS - Firebase过滤器查询

时间:2017-01-25 11:31:41

标签: ios swift firebase firebase-realtime-database

我在Firebase中获得了分数节点:

在得分节点下,我的数据结构如下:

{
"jjTO29ziQ2SjrH5PFzY7ZMpSgjq1-Kak6FCyGtdy_kcEPd4K" =     {
    jjTO29ziQ2SjrH5PFzY7ZMpSgjq1 = "-Kak6FCyGtdy_kcEPd4K";
    score = 5;
};
"jjTO29ziQ2SjrH5PFzY7ZMpSgjq1-KbE_pgfUsukOm4uW0bx" =     {
    jjTO29ziQ2SjrH5PFzY7ZMpSgjq1 = "-KbE_pgfUsukOm4uW0bx";
    score = 4;
};

问题: 我可以按分数过滤数据吗?

我尝试过:

FIRDatabase.database().reference().child("scores").queryOrdered(byChild: "score").observeSingleEvent(of: .value, with: { (snapshot) in

        debugPrint(snapshot.value ?? "nil")

    })

但是无法得到结果?

Picture 1

1 个答案:

答案 0 :(得分:6)

当您对Firebase执行查询时,会得到一个snapshot.value,其中包含每个结果的三条信息:

  • 其关键
  • 其价值
  • 相对于其他节点的位置

当您调用FIRDataSnapshot时,快照将转换为字典。不幸的是,该字典只能保存键值对,因此您将丢失有关节点位置的信息。因此,虽然快照中的数据实际上是正确排序的,但您将丢弃该信息。

解决方案是使用children的内置_commentsRef.observeEventType(.Value, withBlock: { snapshot in for child in snapshot.children { ... } }) 属性以正确的顺序循环子节点。 Firebase documentation on querying有如何做到这一点的样本:

        MyProfileFragment profileFragment = new MyProfileFragment();
        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
        ft.replace(R.id.content_frame, profileFragment);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            profileFragment.setEnterTransition(new Fade().setDuration(200));
            //profileFragment.setExitTransition(new Fade().setDuration(0));
        }

        ft.addToBackStack("profile");
        ft.commit();