比数据快照更好的方法从Firebase检索每个特定帖子的特定数据?返回的位置错误



需要从Firebase检索每个特定事件的LatitudeLongitude,其中用户在创建en事件时也会通过在特定位置设置标记来选择事件位置(LatitudeLongitude(。

我遇到的问题是,保存的最后一个事件会覆盖所有其他现有的事件位置,因此当您点击TextView将您带到GoogleMaps以显示事件将在哪里发生时,只有最后一个事件的位置保存。但显然每个事件都有其特定的位置。

例如,如果我创建了三个事件,并且它们的位置是罗马、柏林和莫斯科,则GoogleMap上创建的唯一标记将是莫斯科的事件,因为这是保存的最后一个位置。

我希望当第二个用户使用每个特定于事件postid击中TextView时,该事件可以在数据库中找到,并在地图上显示其特定坐标。有人可以帮助我实现这一目标吗?我一直在尝试通过datasnapshot实现这一目标,但我无法找到其他活动地点。我总是为所有帖子保存最后一个事件的位置。有没有比datasnapshot更好的方法?

下图希望有助于弄清楚我的数据结构是如何组织的。

火碱数据结构

地图活动用户.java

public class MapsActivityUser extends FragmentActivity implements OnMapReadyCallback {
private GoogleMap map;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps_user);
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
map = googleMap;
final DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Posts");
reference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
Post post = snapshot.getValue(Post.class);
if (post != null) {
double latitude = post.getLocation().getLatitude();
double longitude = post.getLocation().getLongitude();
LatLng location = new LatLng(latitude, longitude);
map.addMarker(new MarkerOptions().position(location).title("Event location"));
map.moveCamera(CameraUpdateFactory.newLatLngZoom(location, 10));
} else {
Toast.makeText(MapsActivityUser.this, "Event doesn't have location on Map", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
}

代码中的问题是使用以下代码行:

map.moveCamera(CameraUpdateFactory.newLatLngZoom(location, 10));

在 for 循环中,这基本上意味着您的相机将被移动到循环中迭代的最后一个位置。但是,如果您增加缩放比例,您将能够在地图上看到所有位置。根据你最后的评论:

我怎样才能使它只出现该特定事件位置的标记而其他事件没有?

在这种情况下,应使用查询。基本上,您将告诉 Firebase 仅返回与您的查询匹配的单个位置。这应该看起来像这样:

Query query = reference.orderByChild("locationName").equalTo("locationName");

现在,只需在此query上附加一个侦听器并在地图上添加标记即可。在这种情况下,建议将相机移动到该位置,因为您只能获得一个位置。但请注意,如果您有唯一的位置名称,则此查询将起作用。如果还存储位置的 ID,则只能使用如下所示的DatabaseReference

DatabaseReference locationRef = reference.child(locationId);

附加侦听器并在地图上添加标记。

编辑:

要获取纬度和经度,请使用以下代码行:

Query query = reference.orderByChild("postid").equalTo("-LzNDAXtnT6NXYK2XYPK");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
double latitude = ds.child("location").child("latitude").getValue(Double.class);
double longitude = ds.child("location").child("longitude").getValue(Double.class);
Log.d(TAG, latitude + ", " + longitude);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
}
};
query.addListenerForSingleValueEvent(valueEventListener);

侦听集合回调(查询快照(, 在回调运行forloop中,您将获得DocumentChanges类,您将在其中添加,删除,修改指示器,指示何时添加,删除和修改数据,相应地执行您的逻辑。 若要获取文档,请使用 getId,它将返回集合中存在的所有文档 ID。 我不在电脑前面,只是检查谷歌。

我将尽快编辑解决方案。

最新更新