使用Android / Java从嵌套对象Firebase中检索数据?

时间:2017-09-20 06:03:23

标签: java android firebase firebase-realtime-database nosql

您好,我是Firebase的新手。这就是我的数据的样子enter image description here

我想知道如何从零售商处检索distributorInfo。我正在尝试从FirebaseRecyclerAdapter的populateViewHolder方法中检索distributorInfo。我能够获取所选项目的密钥。如何获取distributorInfo里面的信息?

 private void getRetailers() {
        FirebaseRecyclerAdapter<RetailerInfo,RetailerViewHolder> adapter = new FirebaseRecyclerAdapter<RetailerInfo, RetailerViewHolder>(
                RetailerInfo.class,
                R.layout.distributor_row,
                RetailerViewHolder.class,
                mDatabase
        ) {
            @Override
            protected void populateViewHolder(RetailerViewHolder viewHolder, final RetailerInfo model, final int position) {

                viewHolder.setAddress(model.getContactPerson());
                viewHolder.setArea(model.getContactNumber());
                viewHolder.setShopName(model.getShopName());
                viewHolder.setZipcode(model.getZipcode());
                viewHolder.setCity(model.getCity());


                viewHolder.mView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {

//                        DatabaseReference ref = getRef(position);
//                        String key=   ref.getKey();
//                        Toast.makeText(Distributors.this, key, Toast.LENGTH_SHORT).show();


                        ValueEventListener valueEventListener = new ValueEventListener() {

                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                RetailerInfo retailerInfo = dataSnapshot.getValue(RetailerInfo.class);


                                Iterator it = retailerInfo.getDistributorInfo().entrySet().iterator();
                                while (it.hasNext()) {
                                    Map.Entry pair = (Map.Entry)it.next();
                                    Log.d("TAG","distributorInfo: "+pair.getKey() +  " = "  + pair.getValue());
                                    it.remove(); // avoids a ConcurrentModificationException
                                }
                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }
                        };


                        mDatabase.addListenerForSingleValueEvent(valueEventListener);

                    }
                });
            }
        };

        recyclerView.setAdapter(adapter);
    }

RetailerInfo代码: -

public class RetailerInfo {     String id,shopName,address,city,zipcode,area,contactPerson,contactNumber,contact_person_email,location_master,type,last_vist,last_visited_by,cityName,salesPersonName;     HashMap distributorInfo;

    public RetailerInfo() {
    }

    public RetailerInfo(String id, String shopName, String address, String city, String zipcode, String area, String contactPerson, String contactNumber, String contact_person_email, String location_master, String type, String last_vist, String last_visited_by, String cityName, String salesPersonName, HashMap<String, String> distributorInfo) {
        this.id = id;
        this.shopName = shopName;
        this.address = address;
        this.city = city;
        this.zipcode = zipcode;
        this.area = area;
        this.contactPerson = contactPerson;
        this.contactNumber = contactNumber;
        this.contact_person_email = contact_person_email;
        this.location_master = location_master;
        this.type = type;
        this.last_vist = last_vist;
        this.last_visited_by = last_visited_by;
        this.cityName = cityName;
        this.salesPersonName = salesPersonName;
        this.distributorInfo = distributorInfo;
    }

    public HashMap<String, String> getDistributorInfo() {
        return distributorInfo;
    }

    public String getId() {
        return id;
    }

    public String getShopName() {
        return shopName;
    }

    public String getAddress() {
        return address;
    }

    public String getCity() {
        return city;
    }

    public String getZipcode() {
        return zipcode;
    }

    public String getArea() {
        return area;
    }

    public String getContactPerson() {
        return contactPerson;
    }

    public String getContactNumber() {
        return contactNumber;
    }

    public String getContact_person_email() {
        return contact_person_email;
    }

    public String getLocation_master() {
        return location_master;
    }

    public String getType() {
        return type;
    }

    public String getLast_vist() {
        return last_vist;
    }

    public String getLast_visited_by() {
        return last_visited_by;
    }

    public String getCityName() {
        return cityName;
    }

    public String getSalesPersonName() {
        return salesPersonName;
    }

    public void setId(String id) {
        this.id = id;
    }

    public void setShopName(String shopName) {
        this.shopName = shopName;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public void setZipcode(String zipcode) {
        this.zipcode = zipcode;
    }

    public void setArea(String area) {
        this.area = area;
    }

    public void setContactPerson(String contactPerson) {
        this.contactPerson = contactPerson;
    }

    public void setContactNumber(String contactNumber) {
        this.contactNumber = contactNumber;
    }

    public void setContact_person_email(String contact_person_email) {
        this.contact_person_email = contact_person_email;
    }

    public void setLocation_master(String location_master) {
        this.location_master = location_master;
    }

    public void setType(String type) {
        this.type = type;
    }

    public void setLast_vist(String last_vist) {
        this.last_vist = last_vist;
    }

    public void setLast_visited_by(String last_visited_by) {
        this.last_visited_by = last_visited_by;
    }

    public void setCityName(String cityName) {
        this.cityName = cityName;
    }

    public void setSalesPersonName(String salesPersonName) {
        this.salesPersonName = salesPersonName;
    }
}

感谢任何帮助或建议。谢谢。

2 个答案:

答案 0 :(得分:1)

您也可以嵌套对象:

public class Retailer{
    String Address, area, city, contactNumber, contactPerson, shopName, zipCode;
    DistributorInfo distributorInfo;

    public Retailer(...){
        // Contructor
    }
    // Getter and setters
}

public class DistributorInfo {
    // all fields, constructor, getter and setters
}

用法:

Retailer retailerInfo = dataSnapshot.getValue(Retailer.class);

答案 1 :(得分:1)

在populateViewHolder内部Onclick我将密钥传递给getDistributorInfo(key)。请检查getDistributorInfo的代码: -

private void getDistributorInfo(String key) {
DatabaseReference mDistributor = FirebaseDatabase.getInstance().getReference().child("/retailer/"+key+"/distributorInfo");

ValueEventListener postListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        // Get Post object and use the values to update the UI
        if (dataSnapshot.exists())
        {
            DistributorInfo post = dataSnapshot.getValue(DistributorInfo.class);
            Log.d("DistributorInfo", post.getDist_id());
            Intent intent = new Intent(Distributors.this, DistributorDetailsActivity.class);
            intent.putExtra("id", post.getDist_id());
            intent.putExtra("shopname", post.getShop_name());
            intent.putExtra("address", post.getAddress());
            intent.putExtra("city", post.getCity());
            intent.putExtra("area", post.getArea());
            intent.putExtra("contact_personName", post.getContact_person());
            intent.putExtra("contact_personNumber", post.getContact_person_number());
            intent.putExtra("contact_personEmail", post.getContact_person_email());
            intent.putExtra("zipcode", post.getZipcode());
            intent.putExtra("last_visited_by", post.getLast_visited_by());
            intent.putExtra("lastVisitedBy", post.getLast_visited_by());
            intent.putExtra("cityName", post.getCity());
            intent.putExtra("type", "Retailer");
            startActivity(intent);
        }else{
            Toast.makeText(Distributors.this, "DistributorInfo is missing.", Toast.LENGTH_SHORT).show();
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        // Getting Post failed, log a message
        Log.d("DistributorInfo", "loadPost:onCancelled", databaseError.toException());

    }
};
mDistributor.addValueEventListener(postListener);


  }

感谢@FrankvanPuffelen的指导。