【问题标题】:How to retrieve user details by user id inside for loop?如何通过for循环中的用户ID检索用户详细信息?
【发布时间】:2017-05-08 21:23:40
【问题描述】:

我的 firebase 数据库结构如下:

如果我想通过将 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;
}

【问题讨论】:

  • 您的问题是关于您在最后一个代码 sn-p 中所做的事情是否正确?如果是这样,从表面上看,这对我来说很好。鉴于您的 p-tasks 对象存储了对您的 User 对象的引用,使用另一个 DatabaseReference 解析用户似乎是合适的。
  • 没错,但我无法在方法getUser() 中返回用户对象,如果我尝试创建一个全局用户对象实例并在此方法getUser() 中初始化它,出于某种原因我得到了稍后当我更新 UI 时为 null,但我已经对其进行了测试,并且用户对象不为 null,但似乎在下一个 for 循环开始之前它没有被初始化。
  • 这个链接很适合你的问题。我认为这对你有帮助stackoverflow.com/a/45328201/5973946

标签: android firebase firebase-realtime-database


【解决方案1】:
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();

    }
}

【讨论】:

    【解决方案2】:

    请看这个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);
    }
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-21
      • 2015-05-10
      • 2014-11-08
      • 1970-01-01
      • 2017-10-11
      • 2016-04-05
      • 2021-12-31
      • 2015-05-31
      相关资源
      最近更新 更多