2016-05-03 31 views
0

也許是一個令人困惑的標題,但我會盡我所能地盡力解釋。 創建特定片段時,我想將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

不能加載腳本是這樣的:

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()); 
    } 
    } 

,對於循環是必要的,因爲一個查詢可以匹配任何數量的孩子,所以它返回一個列表。即使只有一個匹配的孩子(就像你期望的那樣),它會返回一個長度爲1的列表。

除此之外,查詢被覆蓋在Firebase guide on querying data

+0

非常感謝您的回答!那樣做了!我有一種感覺,這是沿着這條線,但無法繞過它。 –

+0

如果下一次嘗試隔離出現問題的代碼,它會有幫助。例如,這個問題與Android無關,這意味着您在一個(更簡單的)Java應用程序中遇到同樣的問題。隔離問題使得你更有可能自己發現問題*和*如果你不這樣做,它會使其他人更容易發現問題(因爲他們有更少的事情要考慮)。 –

+0

關於您的數據結構的說明:您似乎希望'scripttitle'值是唯一的。在這種情況下,你可能更好地將它們存儲爲'/ scripts/$ scripttitle/scripturl'。通過這種結構,您的原始代碼可以發揮作用,您可以保證腳本標題是唯一的,並且可擴展性更強(因爲您可以直接訪問子節點,而不是發起潛在的昂貴查詢)。 –