【问题标题】:Getting big data unnecessarily while using orderbychild() from Firebase?使用 Firebase 的 orderbychild() 时不必要地获取大数据?
【发布时间】:2020-01-14 19:24:29
【问题描述】:

我正在开发一个包含视频和文章提要的应用。我实现了滑动刷新布局。每当用户滑动它时,它都会从 Firebase 加载最后 5 个视频数据。

我的数据库是这样的(数据不多)=>

滑动刷新布局监听器 =>

 mSwipeRefreshLayout.setOnRefreshListener(() -> {
        manager.scrollToPosition(0);
        refreshVideoFeed();

    });

而 refreshVideoFeed 方法会触发这个 =>

 Query query = myRef.orderByChild("videoDate").limitToLast(5);

    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
              ..................

它工作正常。但是,当我查看实时数据库仪表板时,我意识到应用程序正在使用大量数据(即使应用程序不在产品中)

然后我在 Android Studio 中打开 Profiler 看看发生了什么。我按孩子“videoDate”订购并获得了最后 5 个视频。刷新视频源需要 76 KB。

然后我再次按孩子“videoDate”订购并获得了最后 20 个视频。再次花费77KB!

另外,我为文章提要实现了相同的机制。我的实时数据库中有 236 篇文章。每当用户滑动时,它会加载 10 篇文章,花费 3.6 MB!

我想知道为什么会发生这种情况以及如何避免这种情况。似乎 Firebase SDK 将所有视频提取到客户端,然后过滤它们。但我只想获取我指定的特定范围的数据。

【问题讨论】:

  • 在您的安全规则中,您是否在videoDate 上使用了define an index?否则,myRef 下的所有数据都将传输到客户端并在那里过滤。

标签: android firebase android-studio firebase-realtime-database


【解决方案1】:

只有在您过滤的属性/值上定义了索引时,才会在 Firebase 服务器上对数据进行排序和过滤。如果没有索引,则服务器将所有数据发送给客户端,然后客户端对其进行排序和过滤。发生这种情况时,日志输出中应该有一条非常明确的消息。

对于 define an index,您可以在 Firebase 控制台和 myRef 指向的节点上转到 security rules panel,以添加 .indexOn 属性。假设myRef 指的是/articles,它看起来像L

{
  "rules": {
    "articles": {
      ".indexOn": "videoDate"
    }
  }
}

如果您对不同的属性进行排序/过滤,您可以添加多个索引:

".indexOn": [ "videoDate", "category" ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-09
    相关资源
    最近更新 更多