我试图实现一种搜索功能,在该功能上,单击搜索结果后,我会在一个片段中显示用户的详细信息。问题出在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())
所以:
user_account_settings
。user_id
财产价值。由于您显示的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] 删除。
我来说两句