2017-05-08 1 views
0

내가 이렇게 내 중포 기지 데이터베이스를 구축 한 : 루프 내에서 사용자 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) { 

     } 
    }); 

여기서 모든 작업을 가져 왔는데 이제는 하나 이상의 매개 변수가 필요하며 사용자 세부 정보가 필요하지만 실제로 가져 오는 방법을 모르겠습니다. 이것이 올바른지 잘 모르겠습니다. 어쩌면 사용자 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()를 초기화하려고하면 어떤 이유로 인해 null이 생길 것입니다. 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() 메서드를 사용할 필요가 없습니다. 두 번째 반복 만 제거하면됩니다. 코드는 다음과 같아야합니다.

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

희망이 있습니다.

관련 문제