【问题标题】:Firebase gets slower when counting products from the database (Android)从数据库中计算产品时,Firebase 变慢(Android)
【发布时间】:2018-10-31 15:55:40
【问题描述】:

我有一个运动产品数据库。用户可以根据需要添加任意数量的产品,只要产品正确且经过管理员批准即可。一切正常,但在上个月,我检查了应用程序,它开始运行非常缓慢。我在真实设备和模拟器上检查过。相同的行为。我认为问题在于产品的数量在不断增长,而对产品进行计数则更加困难。谁能帮我解决这个问题?谢谢!

代码:

FirebaseDatabase.getInstance().getReference("sport_products").addListenerForSingleValueEvent(
        new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                int productCount = (int) dataSnapshot.getChildrenCount();

                for(DataSnapshot productSnapshot : dataSnapshot.getChildren()) {

                    //Code to process the data

                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError de) {}
        }
);

【问题讨论】:

  • 能否请您添加您用来计数产品的代码?
  • 已发布代码。请看。

标签: java android firebase firebase-realtime-database


【解决方案1】:

这取决于您在sport_products 节点下拥有多少数据(产品)以及您在检索数据的设备上拥有多少带宽。

所以这会比必要的慢,因为您要检索所有实际产品,而不仅仅是一个简单的计数器。为了解决这个问题,我建议您在数据库中的某个位置为所有产品保留一个单独的计数器,这样您就可以在每次用户添加或删除产品时更新它。虽然这需要更多代码来跟踪产品数量,但阅读它会变得容易得多。

假设您有一个如下所示的数据库:

Firebase-root
    |
    --- productCounter: 500
    |
    --- sport_products
           |
           --- productId
                 |
                 --- //Product details

您可以在数据库根目录下添加计数器。要获取计数器,只需在productCounter 属性上附加一个侦听器并从DataSnapshot 对象中获取值。由于您可能会在多用户环境中使用此应用程序,因此我建议您使用 Firebase Transaction 来增加/减少计数器,如我对 post 的回答中所述。

编辑:

ChildEventListener 之外的方法将在各个子节点上触发,并且不携带整个结果的信息。获取sport_products 节点的产品计数的唯一方法是将您自己的计数器保存在代码中,并在onChildAdded() 方法中增加它并在onChildRemoved() 方法中减少它。这为您提供了您的客户端代码已经处理了多少孩子的计数器。

【讨论】:

  • 您好,谢谢,但我没有 500 个产品,我有超过 35k。如果我使用 ChildEventListener,它会帮助我更多吗?
  • 该架构中的数字仅作为示例。另请参阅我的实际更新答案。
  • 感谢您的有益解释。
猜你喜欢
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-23
  • 2017-03-29
相关资源
最近更新 更多