【问题标题】:GeoFire and Firebase useage to locate nearest userGeoFire 和 Firebase 用于定位最近的用户
【发布时间】:2016-08-15 11:47:42
【问题描述】:

在通过 firebase Git 工作后,我遇到了一些问题, 这是我的数据库:

一开始我就定义了

geoFire.setLocation("firebase-hq", new GeoLocation(lat, lang));

编辑:经过几次修复后,我会发现问题... 我试图找到某个用户中的所有用户,经过一些修复它确实找到了每个人,但它也发现了自己...... 我怎样才能避免添加我自己的用户(或从找到的用户中删除我自己的用户密钥......) 这是代码(希望能更好地解释这个问题,因为英语不是我的母语)。 runnersNearby 是此半径上的用户...

        mDatabase = FirebaseDatabase.getInstance().getReference();
        mAuth = FirebaseAuth.getInstance();
        double lat = gpsTracker.getLatitude();
        double lang = gpsTracker.getLongitude();
        mDatabase.child("User").child(mAuth.getCurrentUser().getUid()).child("latitude").setValue(lat);
        mDatabase.child("User").child(mAuth.getCurrentUser().getUid()).child("longitude").setValue(lang);
        mDatabase.child("User").child(mAuth.getCurrentUser().getUid()).child("Availability").setValue(true);
        geoFire.setLocation(uid, new GeoLocation(lat, lang));
        GeoQuery geoQuery = geoFire.queryAtLocation(new GeoLocation(lat, lang), 100);
        geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
            @Override
            public void onKeyEntered(String key, GeoLocation location) {
                Toast.makeText(UserProfile.this, "Successfully Found", Toast.LENGTH_SHORT).show();
                runnersNearby.add(key);
                Log.d("Number of users", String.valueOf(runnersNearby.size()));
                Toast.makeText(UserProfile.this, String.valueOf(runnersNearby.size()), Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onKeyExited(String key) {
                Toast.makeText(UserProfile.this, "left the place", Toast.LENGTH_SHORT).show();
                runnersNearby.remove(key);
            }

            @Override
            public void onKeyMoved(String key, GeoLocation location) {
                Toast.makeText(UserProfile.this, "key moved but here", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onGeoQueryReady() {
                System.out.println("All initial data has been loaded and events have been fired!");
            }

            @Override
            public void onGeoQueryError(DatabaseError error) {
                Toast.makeText(UserProfile.this, "Error Occured", Toast.LENGTH_SHORT).show();
            }

【问题讨论】:

  • 您将 GeoFire 引用到数据库的根目录,这是一个问题。你能发布你的地火代码吗?
  • @Wilik 我做了一些修复,希望现在我的问题更容易理解......

标签: android firebase firebase-realtime-database geofire


【解决方案1】:

问题是,您将 geofire 引用到根节点。您应该将其引用到 geofire 的特殊节点。

你的数据库结构应该是什么样子

"User": {
    "uid1": {
        "Availability": true,
    },
    "uid2": {
        "Availability": true,
    }
},
"User_Location": {
    "uid1": {
        .. some geofire data ..
    },
    "uid2": {
        .. some geofire data ..
    }
}

如何将 geofire 引用到另一个位置

DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("User_Location");
GeoFire geoFire = new GeoFire(ref);

然后照常设置位置

geoFire.setLocation(userId, new GeoLocation(userLatitude, userLongitude));

之后,Geofire 查询应该可以正常工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-14
    相关资源
    最近更新 更多