当前位置: 首页 > 面试题库 >

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

墨高杰
2023-03-14
问题内容

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

码:

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

问题答案:

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

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

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

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

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

编辑:

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



 类似资料:
  • 我正在尝试为函数编写一个代码段。php文件,该文件仅显示所选变体的一个价格,因此忽略了在单个产品页面上随变体价格一起显示的价格范围。我正在使用以下代码: 问题是,例如,当您有两个单一产品的变体,而其中一个缺货时,此脚本会在单一产品页面上隐藏剩余变体的价格。我在想,也许每个产品都有一些可用的变体,并使用IF来使用标准的单一产品模板来显示它们。或者你有更好的办法解决这个问题?

  • 我已经花了几个小时阅读产品分支中的0和1。请在Firebase数据库有经验的人帮助我:(

  • 我需要显示一些变化的可用“库存”。问题是我需要在一个静态的标准WP页面上做这件事。我知道产品ID和变体ID,我可以使用这些来获得WooCommerce模板之外的变体库存计数吗?我可以使用PHP或AJAX,我已经有一个自定义页面模板应用于该页面。

  • 我正在寻找一种方法,以数组[]或字符串等格式从Firebase实时数据库获取数据。 我的数据库如下所示:链接到数据库的图像 或者:

  • 我在一个Android应用程序中使用Firebase数据库,每次用户启动时,我都会在数据库中存储一些值,为此我会执行以下操作: 正如您在子方法中看到的,如果称为“usrId”,它将创建usrId目录,并在其中添加所有neccesary信息。但是我想为每个用户创建目录,所以我尝试传递usrId变量作为参数。但它不起作用。当我调试代码时,调试器说本地var usrId无法识别,我的问题是如何在Fire