首页 > 解决方案 > 如何使用颤振从 Firebase 实时数据库中检索特定数据?

问题描述

我正在构建一个应该为您创建电影库的应用程序。我已经设置了我的 firebase 数据库来存储电影标题和数据库中的所有电影规格,如下所示:在此处输入图像描述

我想要采取的下一步是仅阅读电影标题(Official Secrets、Seberg、Unbreakable Kimmy Schmidt),以创建一个向用户显示电影标题的列表。我尝试使用

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

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

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

我也试过:

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

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

标签: firebaseflutterfirebase-realtime-databasedart

解决方案


不幸的是,简单的答案是你不能。不适用于当前架构。由于 RTDB 中数据的组织方式,不可能只获取电影标题而不获取整个节点的子数据。

您现在必须做的称为数据扁平化,即避免深度嵌套以避免获取节点的全部数据。本关于结构化数据的指南可能会有所帮助。

您可以创建一个名为的附加节点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
    },
],

推荐阅读