如何在Android应用中查询Firebase中的关系

时间:2017-02-01 07:19:31

标签: android firebase firebase-realtime-database

说我有一个拥有宠物的用户的应用程序。

根据我在不同来源阅读的内容,这是在Firebase DB中建模关系的有效方法:

{
  "users":{
    "user1":{
      "name":"Arthur",
      "pets":{
          "pet1":true,
          "pet2":true
      }
    },
    "user2":{
      "name":"George",
      "pets":{
        "pet3":true,
        "pet4":true
      }
    }
  },
  "pets":{
    "pet1":{...},
    "pet2":{...},
    "pet3":{...},
    "pet4":{...}
  }
}

假设我有一个Android应用程序,我想提供所有用户的列表,并在每个列表项中也提到用户拥有的宠物。

我想要的是一个User对象列表,其中每个User对象都有一个Pet对象列表。例如:

public class User {

    public String name;
    public List<Pet> pets;

    ...
}

查询数据库以获得此结果的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

考虑到您拥有FirebaseDatabase实例

,首先需要查询
databaseQuery = firebaseDatabase.child("users").child("user1").orderByChild("name");

如果您想了解有关如何在Firebase中执行常见SQL查询的更多信息,可以在此处阅读Common SQL Queries Converted for Firebase

然后使用FirebaseUI,您可以按照自己的方式显示数据。

要将firebase对象映射到POJO,我使用了FirebaseUI

 adapter = new FirebaseRecyclerAdapter<POJOClass, CustomVH>(POJOClass.class, R.layout.your_layout_file, CustomVH.class, databaseQuery)
    {
        @Override
        protected void populateViewHolder(final CustomVH viewHolder,final POJOClass model, int position)
        {
            viewHolder.setListItemTitle(model.getItem());
            viewHolder.setListItemCategory(model.getCategory());
            viewHolder.setImageView(model.getDownloadImageUrl(),getContext());
        }
    };
    recyclerView.setAdapter(adapter);

我的ViewHolder类为:

public class CustomVH extends RecyclerView.ViewHolder {
private final TextView listItemTitle;
public CheckBox checkBox;
private final TextView listItemCategory;
private ImageView imageView;

public CustomVH(View itemView)
{
    super(itemView);
    listItemTitle = (TextView) itemView.findViewById(R.id.listItemText);
    checkBox = (CheckBox) itemView.findViewById(R.id.checkBoxListItem);
    listItemCategory = (TextView) itemView.findViewById(R.id.listItemCategoryText);
    imageView = (ImageView) itemView.findViewById(R.id.customMyBucketListItemImage);
    deleteButton = (ImageButton) itemView.findViewById(R.id.listItemDeleteButton);
}

public void setListItemTitle(String name)
{
    listItemTitle.setText(name);
}

public void setListItemCategory(String category)
{listItemCategory.setText(category);}

public void setImageView(String imageUrl, Context context)
{
    //set your imageview
}
}