如果没有创建 Geofire,我如何检查 Geofire 以注销用户?

Posted

技术标签:

【中文标题】如果没有创建 Geofire,我如何检查 Geofire 以注销用户?【英文标题】:How can I check Geofire to log user out if no Geofire was created? 【发布时间】:2019-08-17 06:40:31 【问题描述】:

问题总结:我是 android Studio 和 Firebase 与 Geofire 的新手,请温柔。我的目标是当用户在我的应用程序的地图屏幕上没有 Geofire 位置时将其注销。我不知道如何在我的 Geofire 中查询“g”。如何查询“g”子项以查看它是否已创建?如果未创建“g”,则需要注销它们。所以目标是查询“g”并创建方法,如果“g”为空,则将用户注销。

我做过的事情: 许多 *** 帖子都没有使用 Android Studio。我确实找到了这个I have inserted location using geofire in firebase,但它并没有解决我的问题。我也试过Google firebase check if child exists

onLocationChanges 是我添加在线供应商的位置,我还想检查是否创建了“g”。

 @Override
public void onLocationChanged(Location location) 


    // Adds VendorOnline Child to Firebase when Vendor is On This Activity
    addVendorOnline();
    // Log user out if they are on the map screen without a "VendorOnline" Uid
    logVendorOutIfBuggy();


这是创建在线供应商并检查“g”是否已创建的方法:

 private void addVendorOnline()

    if (FirebaseAuth.getInstance().getCurrentUser() != null) 

        String vendorId = FirebaseAuth.getInstance().getCurrentUser().getUid();
        DatabaseReference vendorIdReference = FirebaseDatabase.getInstance().getReference("VendorOnline");
        GeoFire vendorGeoFire = new GeoFire(vendorIdReference);
        vendorGeoFire.setLocation(vendorId, new GeoLocation(lastLocation.getLatitude(), lastLocation.getLongitude()));
    
      


   // Log user out if for some reason they do not have a "g" child but are on the map screen.
   private void logVendorOutIfBuggy() 
   DatabaseReference ref = FirebaseDatabase.getInstance().getReference("g");

    if(ref == null)

        Toast.makeText(VendorMapsActivity.this, "Error", Toast.LENGTH_LONG).show();

        FirebaseAuth.getInstance().signOut();
    

我预期会发生什么以及实际会发生什么:如果“g”等于 null,我希望用户退出,但现在用户不会退出。

【问题讨论】:

g 属性在您将位置写入密钥时由 Geofire 自动创建/更新。只要您使用 Geofire,您就不必专门为该属性做任何事情。这听起来有点像XY problem 这里。您想通过检测g 创建来完成什么? 如果没有检测到“g”,我正在尝试注销用户。 我会调用getLocation 作为供应商密钥,如果从未设置(或删除)位置,LocationCallback 应该在onLocationCallback 中返回空值。如果有 'l' 值而没有 'g' 也将是不一致的,因此在没有位置推断出没有 'g' 是公平的。 太棒了,这听起来很有希望。你能给出一个示例代码吗?谢谢朋友。 【参考方案1】:

以下是调用getLocation 以查看供应商是否注册了位置的示例。

来自LocationCallback.onLocationResult 的javadocs:

使用键的当前位置调用此方法。地点 如果 GeoFire 中没有存储密钥的位置,则将为 null。

        final String vendorKey = "someVendorKey";
        geoFire.getLocation(vendorKey, new LocationCallback() 
            @Override
            public void onLocationResult(String key, GeoLocation location) 
                if (key.compareTo(vendorKey) == 0) 
                    if (location == null) 
                        // vendor has not logged a location yet (or it was removed)
                    
                
            

            @Override
            public void onCancelled(DatabaseError databaseError) 

            
        );

【讨论】:

太棒了!这看起来就像我正在寻找的东西。我在其他帖子中找不到其他解决方案看起来像这样。澄清一下,我将 vendorKey 保留为“someVendorKey”对吗? 不,这将是您作为图像拥有的供应商的 uid 键(否则我会复制它)。 啊,我明白了。对于每个登录的用户,uid 密钥都会更改为随机密钥。我使用匿名登录。在获取 vendorKey 时有没有办法解决这个问题? 你是最棒的。你的帮助正是我所需要的。谢谢你。我让它工作。 if (FirebaseAuth.getInstance().getCurrentUser() != null) final String user = FirebaseAuth.getInstance().getCurrentUser().getUid(); DatabaseReference vendorIdReference = FirebaseDatabase.getInstance().getReference("VendorOnline"); GeoFire vendorGeoFire = new GeoFire(vendorIdReference); ... 与 LocationCallBack 结合使用,现在可以在未创建 VendorOnline 时使用!

以上是关于如果没有创建 Geofire,我如何检查 Geofire 以注销用户?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用geofire查询检查10公里半径内是不是存在firebase用户

GeoFire没有获取位置[重复]

GeoFire的半径单位是多少?

有没有办法将 GeoFire 与 Firestore 一起使用?

如何在没有 Geofire 的情况下将位置对象保存在 Firebase 中?

Geofire 已存档,我还应该使用它吗?