从数据库计算产品时,Firebase变慢(Android)

时间:2018-10-31 15:55:41

标签: java android firebase firebase-realtime-database

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

代码:

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) {}
        }
);

1 个答案:

答案 0 :(得分:0)

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

所以这将比必要的慢,因为您要检索所有实际产品而不是简单的计数器。为了解决这个问题,我建议您为数据库中所有产品保留一个单独的计数器,以便在用户每次添加或删除产品时都可以对其进行更新。尽管这需要更多代码来跟踪产品数量,但阅读起来将变得更加容易。

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

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

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

编辑:

ChildEventListener之外的方法将在各个子节点上触发,并且不会携带整个结果的知识。获取sport_products节点的乘积计数的唯一方法是将自己的计数器保留在代码中,并以onChildAdded()方法递增,并以onChildRemoved()方法递减。这样可以为您计算出您的客户端代码已经处理了多少个孩子。