Geofire 正在触发 onGeoQueryReady 而不是 onKeyEntered

Posted

技术标签:

【中文标题】Geofire 正在触发 onGeoQueryReady 而不是 onKeyEntered【英文标题】:Geofire is trigring onGeoQueryReady instead of onKeyEntered 【发布时间】:2019-03-25 06:24:30 【问题描述】:

我想使用 geofire 位置查询从 firebase 数据库中检索数据,但它只是触发 onGeoQueryReady 而不是 onKeyEntered。

我正在这样设置我的位置

user = auth.getCurrentUser().getUid();
 GeoFire geoFire = new GeoFire(ref.child("businesLocation").child(Education).child(CoachingCenter));



 geoFire.setLocation(user, new GeoLocation(latitude, longitude), new GeoFire.CompletionListener() 
                @Override
                public void onComplete(String key, DatabaseError error) 




                
            );




        
    );

并像这样检索数据

GeoFire geoFire = new GeoFire(ref.child("businesLocation").child(Education).child(CoachingCenter));
GeoQuery geoQuery = geoFire.queryAtLocation((location), Raius);

geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() 
        @Override
        public void onKeyEntered(String key, GeoLocation location) 
            getShoplist(key);
        

        @Override
        public void onKeyExited(String key) 
            getShoplist(key);
        

        @Override
        public void onKeyMoved(String key, GeoLocation location) 
        

        @Override
        public void onGeoQueryReady() 
        

        @Override
        public void onGeoQueryError(DatabaseError error) 
        
    );

此查询未获取数据。

这是我的数据库结构

这是我的 Firebase 安全规则

"rules": 
".read": "auth != null",
".write": "auth != null"

我是否需要更改 firebase 安全规则才能使用 geofire?

请帮帮我!

【问题讨论】:

我们无法知道GeoFire geoFire = new GeoFire(ref.child("businesLocation").child(shop_categoryName).child(shop_sub_categoryName)) 是否指向您在屏幕截图中显示的数据。请尝试在一个孤立的、最小的数据结构中重现该问题。我强烈建议阅读how to create a minimal, complete, verifiable example 了解为什么以及如何这样做.. @FrankvanPuffelen 我刚刚添加了更多空间信息。请看一下 变量 EducationCoachingCenter 代表什么?您是否尝试打印路径以确保其有效?同样,locationRaius 是什么?如果不理解和验证这些信息,我们只会猜测答案。 您的安全规则".read": "auth != null" 意味着user must be authenticated 能够读取任何数据。如果不是,您会在onGeoQueryError 中收到错误,您现在将忽略该错误。将其实现为 public void onGeoQueryError(DatabaseError error) throw error.toException(); 以在这种情况下获得更明确的错误。另见***.com/questions/37403747/firebase-permission-denied/… 但用户已通过身份验证。它仍然没有增加数据。那么在这种情况下我该如何找到解决方案 【参考方案1】:

更改我的数据库安全规则后,它开始工作

 
  "rules": 
    ".read": "auth != null",
    ".write": "auth != null",
    "geofire": 
      ".read": "true",
        ".indexOn": ["g"]
      
     

它现在开始获取数据。:)

【讨论】:

以上是关于Geofire 正在触发 onGeoQueryReady 而不是 onKeyEntered的主要内容,如果未能解决你的问题,请参考以下文章

使用 geofire 仅检索 3 英里内的用户列表

GeoFire没有获取位置[重复]

GeoFire 给 CocoaPods 带来问题

如何使用geofire从firebase获取位置

GeoFire的半径单位是多少?

GeoFire 结构与文档不匹配