这是HomePage.java代码
ProfileDetail pd=new ProfileDetail(Email1);
Log.d("TAG","profile in HomePage");
Profile p=pd.getAllDetails();
Log.d("TAG","profile after Method in HomePAge");
这是我的ProfileDetail类:
public class ProfileDetail implements Parcelable {
private String mailId;
private Profile profile;
DatabaseReference mDatabase=
FirebaseDatabase.getInstance().getReference("users").child("profile");
Profile pp=null;
protected ProfileDetail(Parcel in) {
mailId = in.readString();
}
public static final Creator<ProfileDetail> CREATOR = new Creator<ProfileDetail>() {
@Override
public ProfileDetail createFromParcel(Parcel in) {
return new ProfileDetail(in);
}
@Override
public ProfileDetail[] newArray(int size) {
return new ProfileDetail[size];
}
};
public String getMailId() {
return mailId;
}
public void setMailId(String mailId) {
this.mailId = mailId;
}
public ProfileDetail(String mailId)
{
Log.d("TAG","profile inside ProfileDetail mail= "+mailId);
this.mailId=mailId;
readData(new FireBaseCallBack() {
@Override
public void onCallback(Profile p)
{
profile=p;
Log.d("TAG","profile inside louda pp="+p.toString());
Log.d("TAG","profile inside louda");
}
});
}
public Profile getAllDetails()
{
Log.d("TAG","profile inside getALLDEtails");
Log.d("TAG","profile inside getALlDetails pp="+profile.toString());
return profile;
}
public void readData(final FireBaseCallBack fireBaseCallBack)
{
mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot dataSnapshot1:dataSnapshot.getChildren())
{
Log.d("TAG","profile inside 1st datasnapshot");
for (DataSnapshot dataSnapshot2:dataSnapshot1.getChildren())
{
if (mailId.equals(dataSnapshot2.getValue(String.class)))
{
pp =dataSnapshot1.getValue(Profile.class);
Log.d("TAG","profile inside 2nd datasnapshot");
// p[0] =pp;
}
}
}
fireBaseCallBack.onCallback(pp);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel parcel, int i) {
parcel.writeString(mailId);
}
private interface FireBaseCallBack
{
void onCallback(Profile p);
}
}
我得到这个结果
主页中的个人资料 getALLDEtails中的配置文件 个人资料在getALLDEtails外 HomePAge中Method之后的配置文件 1st datasnapshot中的配置文件 1st datasnapshot中的配置文件 1st datasnapshot中的配置文件 第2次数据快照中的个人资料
我在这里提出了不同的解决方案,但没有任何帮助。通过执行此操作,我总是将Profile对象设置为null,因为Profile对象稍后会获得价值,请对此提供帮助
我
答案 0 :(得分:0)
因此,您只想从Firebase数据库仅一次 读取PROFILE字段的值?
在这种情况下,您必须为单个值事件设置监听器
mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// Write you logic here to extract the data
}
@Override
public void onCancelled(DatabaseError databaseError) {
// ...
}
});
此外,如果您只是想获得有限的孩子人数,则需要添加
.limitToFirst(NUM_COUNT)
例如
mDatabase.limitToFirst(2).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// Write your logic here to extract the data
}
@Override
public void onCancelled(DatabaseError databaseError) {
// ...
}
});
Firebase数据库是一个实时数据库,这意味着如果您使用 addValueEventListener(),它将在每次更改数据库值时不断更新该值。
注意:请确保在不再需要该监听器时将其删除。