【问题标题】:Geofire taking a lot of time to load keysGeofire 需要大量时间来加载密钥
【发布时间】:2026-01-11 09:40:01
【问题描述】:

我有一个 android 应用程序,它使用 GPS 位置和GeoFire 获取附近的钥匙。 firebase 数据库中有大约 15,000 个键。从 Android 应用程序加载附近的密钥大约需要 20 秒。为什么会这样?虽然 Firebase Geofire 官方文档指出

GeoFire 有选择地仅加载特定位置附近的数据,让您的应用程序轻巧且响应迅速,即使是非常大的数据集。

Geofire Github Page

【问题讨论】:

  • 您是否为g 属性向数据库添加了索引,如here 所述并在此sample 中显示?

标签: firebase geofire


【解决方案1】:

感谢您的回答。

我通过在 Firebase 数据库的安全规则中添加 ".indexOn": ["g"]g (geohash) 上创建索引解决了我的问题。

【讨论】:

    【解决方案2】:

    当我们遵循推荐的数据库结构时,GeoFire 的性能非常好。要了解更多关于使用 goefire 构造数据的最佳方法,请查看此链接Recommended database structure with GEOFIRE

    现在有以下方法可以改进您的查询以快速获得结果,即使我不知道您的确切用例这可能会有所帮助

    1. 如果您有非常大的数据集,请尝试以增加半径进行多次查询。(如果您不执行任何一次需要所有数据的操作,这种方法很好)

    2. 1234563回收站视图)

    【讨论】:

      【解决方案3】:

      确保您只将 GeoHash 和 Lat / Lon 数据存储在您的 geofire 集合中。如果您需要存储其他数据,您可以将其存储在具有相同键的另一个集合中,并发出单独的查询以根据需要取回该数据。

      我用的是这个结构,看起来效果不错。

      app-id
      -> geodata
      --> geofire
      ---> key
      ----> g: <geohash>
      -----> l: 
      -------> 0: Lat
      -------> 1: Lon
      
      --> other
      ---> key
      ----> <otherhash object>
      

      当您保存数据时,您将使用以下方法单独保存 geofire 数据:

      mDatabase = FirebaseDatabase.getInstance().getReference("geodata");      
      
      geoFire = new GeoFire(mDatabase.child("geofire"));
      
      geoFire.setLocation(people.key, new GeoLocation(people.Lat, people.Lon));
      

      然后您将单独将数据保存在 firebase 中:

          mDatabase = FirebaseDatabase.getInstance().getReference("geodata");
      
          mDatabase.child("other").child(people.key).setValue(people);
      

      希望这会有所帮助。 :)

      【讨论】:

        最近更新 更多