表现明智; (单个事件侦听器)还是Firebase的(查询)?

时间:2018-07-30 13:15:35

标签: java android database firebase memory

如果我知道确切的节点路径,最好使用(addSingleEventListener)或(query)检索单个条目。

我有一个“ X”节点,其中包含10,000+个用户……每个用户有60+个“ Y”子节点,每个子节点都包含3个“ Z”节点类 (10,000 X-> 60 Y-> 3 Z)

现在,我不断使用下面的Java代码来检索Z节点..但我面临的是性能下降和真正的android设备上的outOfMemory崩溃..我在想,“ query.equalTo()”可能会更快..任何想法提高性能

dbRootRef.child("X").child("Y").child("Z")
          .addListenerForSingleValueEvent(new ValueEventListener(){ ... });   

----------------编辑----------------- 谢谢大家的宝贵时间,不过我想澄清一下:

  • 我知道通过侦听器查询和读取数据是不同的过程,但是无论该过程的名称如何,我都需要高效地检索数据。

  • 我的问题在某种程度上是笼统的,我一直在寻找一种通用的适应性方法,可以随着数据库的增大而从数据库检索数据。

1 个答案:

答案 0 :(得分:0)

从Firebase数据库读取数据时,大部分时间将用于实际下载该数据。相比之下,在服务器上发现数据的时间通常很少。

这意味着两种检索相同数据的方法可能会为您提供相似的性能。鉴于此,我会选择最易读的内容。在您知道确切路径的情况下,这就是使用您在共享的代码段中使用的确切路径。该代码段可能会略短一些:

dbRootRef.child("X/Y/Z")
      .addListenerForSingleValueEvent(new ValueEventListener(){ ... })

但是此更改也不会有任何明显的性能差异,因为它会再次检索相同的信息。


更大的性能差异是您使用addListenerForSingleValueEvent还是addValueEventListener。如果对同一数据多次使用addListenerForSingleValueEvent,则您(可能取决于其他因素)将多次读取该数据。如果然后您不仔细清理对这些数据的本地引用,则很容易多次在内存中获得相同的数据。

这就是为什么如果您长期需要数据,建议使用addValueEventListener