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有点陌生,希望你能理解。:)非常感谢你,弗兰克!