【问题标题】:Fetch the JSON array from firebase realtime database. Android从 firebase 实时数据库中获取 JSON 数组。安卓
【发布时间】:2018-07-25 16:08:33
【问题描述】:

我想从我的 Firebase 实时数据库中获取整个 JSON 数组。从实时数据库中获取 Array 并将其存储在自定义类的ArrayList 中。

【问题讨论】:

  • 我要获取Location数组
  • 你试过什么?

标签: java android firebase firebase-realtime-database


【解决方案1】:

使用此代码(带有地图的示例)

    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) {

                }


            });

        }

【讨论】:

  • 它会获取整个 JSON 位置数组吗?
  • 是(DataSnapshot postSnapshot : dataSnapshot.getChildren) - dataSnapshot.getChildren - 一个元素(数据库);
【解决方案2】:

首先,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 的模型类,它具有三个字段 emailidnamelocation 映射加上相应的 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 @ 是地图,对吧?
猜你喜欢
  • 2019-01-17
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
  • 1970-01-01
  • 2019-09-30
  • 1970-01-01
相关资源
最近更新 更多