2017-05-08 91 views
0

我有我的結構化數據庫火力像這樣: 如何通過用戶id在for循環中檢索用戶詳細信息?

這是,如果我想通過傳遞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獲取用戶詳細信息:

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()'出於某種原因,我正在更新用戶界面,但我已測試它,並且用戶對象不爲空,但似乎它在未來的循環啓動之前未初始化。 –

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

希望它有幫助。

相關問題