2017-05-08 71 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); 
} 

希望它有帮助。

相关问题