【发布时间】:2018-07-25 16:08:33
【问题描述】:
【问题讨论】:
-
我要获取Location数组
-
你试过什么?
标签: java android firebase firebase-realtime-database
【问题讨论】:
标签: java android firebase firebase-realtime-database
使用此代码(带有地图的示例)
Map<String, Place> placeMap;
DatabaseReference places;
ArrayList<Place> placeData;
在 onCreate 中
database = FirebaseDatabase.getInstance();
places = database.getReference("Place");
placeMap = new HashMap<>();
创建方法(在 firebase 中获取数据)
private void getAllMarkerPlace() {
places.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
placeData = new ArrayList<>();
place = postSnapshot.getValue(Place.class);
placeMarker = new LatLng(Double.valueOf(place.getLat()), Double.valueOf(place.getLng()));
place.setLatLng(placeMarker);
placeData.add(place);
placeMap.put(place.getName(), place);
mMap.setOnInfoWindowClickListener(MapsActivity.this);
mMap.addMarker(new MarkerOptions()
.position(placeMarker)
.title(place.getName()));
mMap.setInfoWindowAdapter(MapsActivity.this);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
【讨论】:
首先,location 节点不是 array 是一个包含其他位置对象的对象。其次,正如我在您的屏幕截图中看到的那样,您的数据库结构不太好。您的 collion 节点应该包含相同类型的对象。在您的情况下,它包含用户对象和 location 对象。如我所见,在您的位置对象中,您实际上是用户的坐标,为此我建议您将数据库结构更改为:
Firebase-root
|
--- collion
|
--- userId
|
--- email: "jawadkhant557@gmail.com"
|
--- id: "CQuL...ihq1"
|
--- name: "jawadkhan"
|
--- location
|
--- latitude: 31.54614619
|
--- longitude: 74.40240774
在这种情况下,当你想获取用户的经纬度时,只需使用以下几行代码即可:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("collion").child(uid).child("location");
uidRef.addListenerForSingleValueEvent(/* ... */);
假设您有一个名为 Collion 的模型类,它具有三个字段 email、id、name 和 location 映射加上相应的 getter,如果您想获取所有用户对象请使用以下代码:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference collionRef = rootRef.child("collion");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
Collion collion = ds.getValue(Collion.class);
Log.d("TAG", collion.getName());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
collionRef.addListenerForSingleValueEvent(valueEventListener);
【讨论】:
collion对象获取它们:double latitude = collion.getLocation().get("latitude");,因为@987654335 @ 是地图,对吧?