2017-05-08 5 views
0

私はこのように私のfirebaseデータベースを構造化している: forループ内でユーザーIDを使用してユーザーの詳細を取得する方法は?

そして、これは私がパラメータとしてIDを渡すことで、ユーザの詳細を取得したい場合、私はSQLでデータベースに私のテーブルを構築する方法を方法です。

しかし、これは期待どおりに機能しません。

databaseReference.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(final DataSnapshot dataSnapshot) { 

      for (final DataSnapshot snapshot : dataSnapshot.getChildren()) { 
       final String taskName = snapshot.child("name").getValue(String.class); 
       final String assignedUserId = snapshot.child("assignedUserId").getValue(String.class); 
       final String categoryId = snapshot.child("categoryId").getValue(String.class); 
       final Boolean completed = snapshot.child("completed").getValue(Boolean.class); 
       final String priority = snapshot.child("priority").getValue(String.class); 

       User user = getUser(assignedUserId); 

       ProjectTask projectTask 
         = new ProjectTask(snapshot.getKey(), dataSnapshot.getKey(), taskName, assignedUserId, priority, completed, categoryId, user); 
       mProjectTaskList.add(projectTask); 
      } 

      for (Category category : mCategories) { 
       mProjectTasksSection = getTasksWithSection(category); 

       if (mProjectTasksSection.size() > 0) { 
        mSectionedRecyclerViewAdapter.addSection(new ProjectTaskListAdapter(R.layout.lst_todo_item_v2, mProjectTasksSection, 
          category, getActivity())); 
       } 
      } 

      LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity()); 
      recyclerProjectTasks.setLayoutManager(linearLayoutManager); 
      recyclerProjectTasks.setItemAnimator(new DefaultItemAnimator()); 
      recyclerProjectTasks.setAdapter(mSectionedRecyclerViewAdapter); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

ここで私はすべてのタスクをフェッチしましたが、今ではもう1つのパラメータが必要ですが、それはユーザーの詳細ですが、実際にどのように取得するのか分かりません。これが正しいのかどうかはわかりません。たぶん私はユーザーIDの代わりにユーザー名を格納する方が簡単だろう。私はidで、ユーザーの詳細を取得しようとしている私のコードを掲載します下:

private User getUser(String keyId) { 
    DatabaseReference databaseReference = AppController.getInstance().getDatabase() 
      .getReference().child("users").child(keyId); 

    databaseReference.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      User user = dataSnapshot.getValue(User.class); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

    return null; 
} 
+0

最後のコードスニペットで行っていることが適切かどうかについてご質問がありますか?もしそうなら、表面のレベルでは、これは私とうまく見えます。あなたの 'p-tasks'オブジェクトがあなたの' User'オブジェクトへの参照を格納しているとすれば、別の 'DatabaseReference'を使ってユーザを解決するのが適切だと思われます。 – Brian

+0

正確には、私は 'getUser()'メソッドでユーザーオブジェクトを返すことができませんし、グローバルユーザーオブジェクトインスタンスを作成しようとすると、このメソッドで 'getUser()'を何らかの理由で初期化しようとすると、私はUIを更新していますが、私はそれをテストして、ユーザーオブジェクトはnullではありませんでしたが、この次のループが始まる前に初期化されていなかったようです。 –

+0

このリンクはあなたの質問に一致するのに適しています。私はこれがあなたに役立つと思うhttps://stackoverflow.com/a/45328201/5973946 –

答えて

0
for(DataSnapshot postSnapshot:dataSnapshot.getChildren()) 
{ 
//pass name here that you want to 
// if(postSnapshot.getKey().equals("name".equalsIgnoreCase(nameStr))) 
    //compare 
    if(postSnapshot.getKey().equals("name")) 
{ 
    final String taskName = snapshot.child("name").getValue(String.class); 
    //taskName =postSnapshot.getValue().toString(); 

    } 
} 
0

このpostを参照してください。

DatabaseReferenceは正しいですが、 'dataSnapshot`でgetChildren()メソッドを使用する必要はありません。ただ2回目の反復を削除してください。コードは次のようになります。

public void onDataChange(final DataSnapshot dataSnapshot) { 

    final String taskName = snapshot.child("name").getValue(String.class); 
    final String assignedUserId = snapshot.child("assignedUserId").getValue(String.class); 
    final String categoryId = snapshot.child("categoryId").getValue(String.class); 
    final Boolean completed = snapshot.child("completed").getValue(Boolean.class); 
    final String priority = snapshot.child("priority").getValue(String.class); 

    User user = getUser(assignedUserId); 

    ProjectTask projectTask = new ProjectTask(snapshot.getKey(), dataSnapshot.getKey(), taskName, assignedUserId, priority, completed, categoryId, user); 
    mProjectTaskList.add(projectTask); 
} 

希望すると助かります。

関連する問題