如何从已知的子值获取firebase ref

时间:2016-05-03 12:48:08

标签: android firebase

也许是一个令人困惑的标题,但我会尽力解释。 在创建某个片段时,我想将firebase中“scriptURL”子项的值加载到TextView字段中。 在创建片段时,“scriptURL”子节点的“兄弟”的值由args携带到片段中。

我的firebase结构是这样的:

root
-scripts
--UID
---scripttitle:"title"
---scripturl:"url"
--UID
---scripttitle:"title"
---scripturl:"url"

当片段被加载时,我在字符串中有“scripttitle”的值。 我想用它来获得相应的scripturl,但是无法弄清楚如何做到这一点。

我片段的代码:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        Bundle args = this.getArguments();
        String clickedScript = args.getString("clickedScript", null);
        RelativeLayout llLayout    = (RelativeLayout)    inflater.inflate(R.layout.fragment_script_details, container, false);
        final TextView clicked = (TextView)llLayout.findViewById(R.id.scriptTitle);
        final TextView url = (TextView)llLayout.findViewById(R.id.textView7);
        clicked.setText(clickedScript);

        Firebase ref = new Firebase("http://theatre-assistant.firebaseio.com/scripts").child(clickedScript);
        ref.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot snapshot) {
                url.setText((String) snapshot.child("scripturl").getValue());

            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {
                System.out.println("The read failed: " + firebaseError.getMessage());
            }
        });




        return llLayout;
    }

这样,文本字段结束为空白。我相信我的firebase ref已经过了,但这是我唯一能想到的。 希望这是有道理的,有人可以指出我正确的方向来完成这项工作。 我是新手,所以我可能会想到这里。

1 个答案:

答案 0 :(得分:1)

您无法像这样加载脚本:

Firebase ref = new Firebase("http://theatre-assistant.firebaseio.com/scripts")
                      .child(clickedScript);
ref.addValueEventListener(new ValueEventListener() {

child()方法引用其键值为clickedScript的子项。这样的孩子不存在。

相反,您正在寻找执行查询:

Firebase ref = new Firebase("http://theatre-assistant.firebaseio.com/scripts");
Query query = ref.orderByChild("scripttitle").equalTo(clickedScript);
query.addValueEventListener(new ValueEventListener() {
  public void onDataChange(DataSnapshot snapshot) {
    for (DataSnapshot child: snapshot.getChildren()) {
      url.setText((String) child.child("scripturl").getValue());
    }
  }

for循环是必要的,因为查询可以匹配任意数量的子节点,因此它返回一个列表。即使只有一个匹配的孩子(就像你期望的那样),它也会返回一个长度为一的列表。

除此之外,Firebase guide on querying data还涵盖了查询。