如何在Swift中仅为选定的键列表获取Firebase数据库?

时间:2018-03-26 06:47:06

标签: ios swift firebase firebase-realtime-database

我正在使用firebase数据库来存储我的iOS应用程序的数据。

这是我的firebase数据库高级结构:

enter image description here

在此数据库中,我将在菜单选项卡中保存菜单项的数据。这是所有菜单的列表。这是列表菜单,其中所有菜单项都有唯一键:

enter image description here

还有一个节点“用户”,它有一个孩子“消费者”

enter image description here

我在“消费者”节点的不同子节点中保存'喜欢'和'不喜欢'菜单项。 enter image description here

我正在制作一个屏幕,我必须显示用户喜欢的menuItems的所有细节。如您所见,我只在“Like_Deal_Dish”节点中保存menuItem键。

这是我的代码,我通过该代码获取在“Like_Deal_Deish”子项中添加的所有键:

void main() => runApp(new MyApp());

class MyApp extends StatefulWidget {

  @override
  MyAppState createState() {
    return new MyAppState();
  }

}

class MyAppStateextends State<MyApp> {

  ProjectService _projectService;

  @override
  void initState() {
    super.initState();
    _projectService = new ProjectService();
  }

  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
       title: "My App",
        theme: new ThemeData.light(),
        routes: <String, WidgetBuilder> {
          '/projects/add': (BuildContext context) => new HomeScreen(_projectService),
          '/': (BuildContext context) => new HomeScreen(_projectService)
        }
    );
  }
}

控制台日志我获取所有喜欢的列表,menuItem:

enter image description here

查询应该只提取那些在“Like_Deal_Dish”中添加了键的menuItem?

2 个答案:

答案 0 :(得分:1)

您从Like交易中获取了菜单ID。所以现在您可以使用该值再次查询menus孩子

这是示例(未在xcode上测试,请原谅我语法错误,如果有的话)

Database.database().reference().child("Users").child("Consumer")
       .child((Auth.auth().currentUser?.uid)!).child("Like_Deals_Dish")
       .observeSingleEvent(of: .value) { datasnapshot in

        if datasnapshot.exists() {
            print("Like Deals - \(datasnapshot)")
            // Loop here for menu items 
            for rest in datasnapshot.children.allObjects as [FIRDataSnapshot] {
                 // Fetch Menu Info here  with rest.value
                 Database.database().reference()
                                    .child("menus").child(rest.value)
                                    .observeSingleEvent(of: .value) { menu in
                      if datasnapshot.exists() {
                          print("MENU  - \(menu)")
                      }
                  }
              }

        } else {
            print("Liked data is not available")
        }
    }

希望它有用

答案 1 :(得分:0)

您可以在不使用Prashant建议的多个查询的情况下执行此操作。如果您有一个大型数据集,使用查询获取每个密钥将会非常缓慢。您可以像这样得到每个键:

Database.database().reference().child("Users").child("Consumer").child((Auth.auth().currentUser?.uid)!).child("Like_Deals_Dish").observeSingleEvent(of: .value) { datasnapshot in

        if datasnapshot.exists() {

        var keyArray = [String]()

        for snap in datasnapshot.children.allObjects {
            if let snap = snap as? DataSnapshot {
                let key = snap.key
                keyArray.append(key)
            }
        }

       //use keyArray


        }
        else{

            print("Liked data is not available")
        }


    }