如何使用Flutter从Firebase实时数据库中检索特定数据?

时间:2020-05-05 20:10:42

标签: firebase flutter firebase-realtime-database dart

我正在构建一个应为您创建电影库的应用程序。我已经设置了Firebase数据库,以将电影标题和所有电影规范存储在数据库中,例如:enter image description here

我要采取的下一步是仅读取电影标题(“官方机密”,“塞伯格”,“坚不可摧的金米·施密特”),以向用户显示电影标题的列表。我尝试使用

void readData()
  {
    DBRef.once().then((DataSnapshot datasnapshot){
      print('DATA SNAPSHOT NEXT LINE');
      print(datasnapshot.value);
    });
  }

但是,当我只想要标题时,便会在我的Firebase数据库中获取所有数据。如何只抓标题?然后,如果用户选择了一个标题,那么我想进入数据库并获取该标题下的所有信息。例如:

  1. 用户的媒体库中有这三部电影
  2. 用户选择Seberg
  3. 现在,我的应用程序进入数据库并获取Seberg下包含的所有信息。

我也尝试过:

  void readData()
  {
    DBRef.child('Official Secrets                 (2019)').once().then((DataSnapshot datasnapshot)
    {
      print('DATA SNAPSHOT NEXT LINE');
      print(datasnapshot.value);
    });
  }

我用它来尝试测试仅抓取电影的标题,但这返回null。

2 个答案:

答案 0 :(得分:1)

不幸的是,简单的答案是你做不到。不适用于当前架构。由于RTDB中数据的组织方式,因此无法不提取整个节点的子数据而仅提取电影标题。

您现在必须做的事情称为数据展平,即避免深度嵌套以避免获取节点的全部数据。 guide的结构化数据可能会有所帮助。

您可以创建一个名为movie_titles的附加节点,并将所有电影标题保留在那里,并保持reel-house节点不变。

现在,您始终总是在开始时获取movie_titles节点而没有获取所有数据并在应用程序中显示标题。当用户点击应用中的特定标题时,然后从reel-house节点中获取相应的数据。

您的数据库可能看起来像这样

movie_titles:[
    "title 1",
    "title 2",
    "title 3",
    "title 4",    
],

reel-house: [
    "title 1": {
        // data for title 1
    },
    "title 2": {
        // data for title 2
    },
    "title 3": {
        // data for title 3
    },
    "title 4": {
        // data for title 4
    },
],

答案 1 :(得分:1)

您必须执行以下操作。但是你的数据结构不好

 List<String> readData()
  {
    List<String> titleList = new List()
    Map<String,String> map = new Map();
    DBRef.once().then((DataSnapshot datasnapshot){
      print('DATA SNAPSHOT NEXT LINE');
      print(datasnapshot.value);
      map = datasnapshot.value();
      map.forEach((key,value){
      map.add(key);
      continue;
      })
    });
    return titleList;
 }