Java for循环未在单值事件侦听器内运行

Java for循环未在单值事件侦听器内运行,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我正在尝试实现一个搜索功能,在这里,单击搜索结果时,我会在一个片段中显示用户的详细信息。问题出在init()函数中,onDataChange()函数中的foreach循环没有执行 private User mUser; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanc

我正在尝试实现一个搜索功能,在这里,单击搜索结果时,我会在一个片段中显示用户的详细信息。问题出在
init()
函数中,
onDataChange()
函数中的foreach循环没有执行

private User mUser;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_view_profile, container, false);

    try{
        mUser = getUserFromBundle();
        init();
    }catch (NullPointerException e){
        Log.e(TAG, "onCreateView: NullPointerException: "  + e.getMessage() );

        setupFirebaseAuth();

        return view;
}

private void init(){

    DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
    Query query = reference.child(getString(R.string.db_user_account_settings)).orderByChild(getString(R.string.field_user_id)).equalTo(mUser.getUserid());
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot singleSnapshot :  dataSnapshot.getChildren()){

                UserSettings settings = new UserSettings();
                settings.setUser(mUser);
                settings.setSettings(singleSnapshot.getValue(UserAccountSettings.class));
                setProfileWidgets(settings);
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            throw databaseError.toException();
        }
    });
}

private User getUserFromBundle(){

    Bundle bundle = this.getArguments();
    if(bundle != null){
        return bundle.getParcelable(getString(R.string.intent_user));
    }else{
        return null;
    }
}
strings.xml

<resources>
    <string name="field_user_id">user_id</string>    
    <string name="intent_user">intent_user</string>    
    <string name="db_user_account_settings">user_account_settings</string>  
</resources  

用户id
用户意图
用户帐户设置
您的代码执行以下操作:

reference.child(getString(R.string.db_user_account_settings)).orderByChild(getString(R.string.field_user_id)).equalTo(mUser.getUserid())
也就是说:

reference.child("user_account_settings").orderByChild("user_id").equalTo(mUser.getUserid())
因此:

  • 用户帐户设置下获取所有子节点
  • 根据其
    用户id
    属性的值对其进行排序
  • 仅选择该值存在且等于UID的节点
  • 因为您显示的JSON没有显示
    user\u id
    属性,所以没有结果

    如果将要查找的值作为节点的键,则可以使用
    child(…)
    查找该节点。由于给定键只能有一个子节点,这意味着您不再需要
    onDataChange
    方法中的
    getChildren()
    循环

    比如:

    DatabaseReference reference = FirebaseDatabase.getInstance().getReference();
    Query query = reference.child(getString(R.string.db_user_account_settings)).child(mUser.getUserid());
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            UserSettings settings = new UserSettings();
            settings.setUser(mUser);
            settings.setSettings(singleSnapshot.getValue(UserAccountSettings.class));
            setProfileWidgets(settings);
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            throw databaseError.toException();
        }
    });
    

    .getChildren()
    返回什么?“for循环似乎没有执行”我不确定这意味着什么。请记住,堆栈溢出是一种效率极低的交互式调试器。如果将断点放在(DataSnapshot singleSnapshot:DataSnapshot.getChildren()){
    上并在调试器中运行,它是否到达该行?如果未到达该行,是否调用
    onCancelled
    。请注意
    onCancelled
    的最小实现是:
    public void onCancelled(@NonNull DatabaseError DatabaseError){抛出databaseError.toException();}
    。任何其他内容都会忽略潜在的错误。@FrankvanPuffelen是的。调试器会到达该行,但其中的代码不会执行。这意味着没有子项与查询匹配。这里也是:请记住,堆栈溢出是一个非常低效的调试器,请阅读中的指导以增加我们可以提供帮助的机会。注意缺少:1)getString(R.string.db\u user\u account\u settings)的值是多少?2)getString(R.string.field\u user\u id)的值是多少
    ?4)您查询的JSON是什么?5)您是否按照我的建议实现了取消的
    请参考。我对问题进行了编辑,使其更易于理解和描述。1)、2)我添加了strings.xml代码,您可以参考3)屏幕截图中的蓝色箭头显示了返回的用户ID(这正是我想要的)4)红色部分是我要问的5)是的。我对JSON和firebase有点陌生,希望你能理解。:)非常感谢你,弗兰克!