Firebase / GeoQuery - 最大半径 IF 语句

Posted

技术标签:

【中文标题】Firebase / GeoQuery - 最大半径 IF 语句【英文标题】:Firebase / GeoQuery - Maximum Radius IF Statement 【发布时间】:2020-08-13 12:55:48 【问题描述】:

所以我现在一直在尝试实现一种方法,如果没有找到商人或在最大半径内没有商人,我可以更新用户。因此,该应用程序基本上会搜索 Firebase 中可用的商人,并根据他们的纬度和经度匹配最接近的商人。如果在 1 英里内没有找到,则递增到 2,依此类推。

我一直在努力实施的是一种方式来说明火力基地内是否没有可用的商人,或者是否在某个半径内没有可用的商人,所以一旦增加说 10 英里停止并返回找不到商人。

这是我现在拥有的用于搜索商人并增加半径的代码,但除非我单击结束搜索的按钮,否则永远不会停止搜索,因此我需要一种无需单击按钮即可结束搜索的方法。

private int radius = 1; // 1 radius (mile or km not sure)
private int max_radius = 15;
private Boolean tradesmanFound = false;
private String tradesmanFoundID;
GeoQuery geoQuery;

private void getClosestTradesman() 
    DatabaseReference tradesmanLocation = FirebaseDatabase.getInstance().getReference().child("TradesmanAvailable");

    GeoFire geoFire = new GeoFire(tradesmanLocation);
    geoQuery = geoFire.queryAtLocation(new GeoLocation(customerLocation.latitude, customerLocation.longitude), radius);
    geoQuery.removeAllListeners();

    geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() 
        @Override
        public void onKeyEntered(String key, GeoLocation location) 
            if (!tradesmanFound && requestBol) 
                DatabaseReference customerDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child("Tradesman").child(key);
                customerDatabase.addListenerForSingleValueEvent(new ValueEventListener() 
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) 
                        if (dataSnapshot.exists() && dataSnapshot.getChildrenCount() > 0) 
                            Map<String, Object> tradesmanMap = (Map<String, Object>) dataSnapshot.getValue();
                            if (tradesmanFound) 
                                return;
                            

                            if (tradesmanMap.get("Trade").equals(tradeType)) 
                                tradesmanFound = true;
                                tradesmanFoundID = dataSnapshot.getKey();

                                DatabaseReference tradesmanRef = FirebaseDatabase.getInstance().getReference().child("Users").child("Tradesman").child(tradesmanFoundID).child("CustomerRequest");
                                String customerID = FirebaseAuth.getInstance().getCurrentUser().getUid();
                                HashMap map = new HashMap();
                                map.put("CustomerRequestID", customerID);
                                tradesmanRef.updateChildren(map);

                                getTradesmanLocation();
                                getTradesmanInfo();
                                isRequestFinished();
                                requestTradesmanBtn.setText("Looking for Tradesman's Location...");
                            
                        
                    

                    @Override
                    public void onCancelled(DatabaseError databaseError) 
                    
                );
            
        

        @Override
        public void onKeyExited(String key) 

        

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

        

        @Override
        public void onGeoQueryReady() 
            if (!tradesmanFound) 

                radius++;
                getClosestTradesman();

            
        

        @Override
        public void onGeoQueryError(DatabaseError error) 

        
    );

这一直困扰着我一段时间,因为它在我的脑海中似乎非常简单明了,所以任何帮助都会减轻很多压力。谢谢

【问题讨论】:

【参考方案1】:

你真的很亲密。当地理查询完成加载其初始数据时,它会调用onGeoQueryReady,您现在拥有的为:

@Override
public void onGeoQueryReady() 
    if (!tradesmanFound) 

        radius++;
        getClosestTradesman();

    

因此,如果没有找到商人,您将开始一个更大半径的新查询。这里缺少两件事:

    只有在尚未达到最大范围时才应开始新查询。 您应该取消刚刚完成的现有地理查询,否则您将得到许多重叠的地理查询。

所以在代码中:

@Override
public void onGeoQueryReady() 
    if (!tradesmanFound && radius < 10) 

        geoQuery.removeAllListeners();

        radius++;
        getClosestTradesman();

    


我知道你已经给geoQuery.removeAllListeners()打了电话,但是你现在打的电话实际上并没有做任何事情。


我在您的代码中注意到了这一点:

private int radius = 1; // 1 radius (mile or km not sure)

半径以公里为单位,如example query in the docs 所示。

【讨论】:

感谢您的详细回复:) 所以基本上这就是我需要的查询然后 endRequest() 取消请求所以我应该在 if 之后添加一个 else 而不是说 endRequest() ???这样如果在半径范围内没有找到商人,它就会结束请求,对吧? 类似@Override public void onGeoQueryReady() if (!tradesmanFound &amp;&amp; radius &lt; 10) geoQuery.removeAllListeners(); radius++; getClosestTradesman(); else endRequest(); 但这似乎不起作用

以上是关于Firebase / GeoQuery - 最大半径 IF 语句的主要内容,如果未能解决你的问题,请参考以下文章

如何在另一个项目中使用 Geoquery 与 android 中的 geofire 实时数据库?

geoQuery不输出数据怎么办?

带有recyclerview的双打印地理查询

不支持解析 GeoQuery 'withinKilometres'

在包 GEOquery 中使用 getGEO() 时出错

如何使用 GEOquery 包提取示例标题(名称)?