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

Ritesh Sachan:

我试图实现一种搜索功能,在该功能上,单击搜索结果后,我会在一个片段中显示用户的详细信息。问题出在init()函数中函数内部的foreach循环onDataChange()不执行的情况。

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  

我不知道为什么这不起作用。


来自评论:

1),2)我添加了您可以参考的strings.xml代码3)屏幕截图中的蓝色箭头显示了返回的用户ID(这正是我想要的)4)红色部分是我所要的查询5)是。我对JSON和Firebase有点陌生,

弗兰克·范普菲伦:

您的代码可以:

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())

所以:

  1. 接受下的所有子节点user_account_settings
  2. 订购他们的user_id财产价值
  3. 仅选择该值存在且等于UID的节点。

由于您显示的JSON不显示user_id属性,因此没有结果。

如果您具有要作为节点键查找的值,则可以使用child(...)该值向上查找该节点。而且,由于只能有一个给定的密钥一个子节点,这意味着你不再需要在循环getChildren()onDataChange方法。

所以像这样:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在侦听器中获取变量的值

如何为我在Javascript中的forEach循环中创建的每个链接分配事件侦听器

如何在事件侦听器中覆盖事件阻止默认值?

作用域变量在事件侦听器更改后未在DOM中更新

使用循环创建多个事件侦听器

在Firebase中的onDataChange内设置变量(单值侦听器)

matplotlib事件侦听器未在PyQT小部件中起作用

事件侦听器中的匿名函数与事件侦听器中的匿名函数

如何从Java中另一个类的事件侦听器中检索值?

在事件侦听器中的匿名函数中运行函数

读取事件侦听器未在本机反应中触发

for循环中有多个不同的事件侦听器

方法未在Java侦听器中运行actionPerformed

jQuery中的单击事件侦听器

将事件侦听器附加到FOR循环内的对象

DOMAttrModified事件侦听器未在Android WebView中触发

Firebase单值事件侦听器不返回

For 循环仅将数组的最后一个值分配给事件侦听器

创建一个事件侦听器来侦听变量中的值是否已更改

如何使用 for 循环删除多个事件侦听器?

删除for循环javascript中的事件侦听器

Firebase onDataChange - 值事件侦听器不侦听更改

Java 中的事件(侦听器)

如何在尚未在 DOM [no-jQuery] 中的元素上添加事件侦听器?

异步等待函数未在事件侦听器中执行

如何避免“on_press”侦听器事件的循环?

事件侦听器未在 DIV 中的第二个按钮上触发

类中的 Javascript 事件侦听器

事件侦听器未在移动设备上触发